题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717

5-9 旅游规划   (25分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1);MM是高速公路的条数;SS是出发地的城市编号;DD是目的地的城市编号。随后的MM行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

输出样例:

3 40

/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2017-07-04 21:04 正在评测 0 5-9 gcc 无 无
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 12/12 3 3
测试点2 答案正确 5/5 3 3
测试点3 答案正确 4/4 4 3
测试点4 答案正确 4/4 69 3 25分的题,套一下dijkstra就AC了
*/
#include<stdio.h>
#define MAXN 500
#define TRUE 1
#define FALSE 0
#define INFINITY 100000
#define ERROR -1
struct Edge
{
int dist;
int cost;
} gMatrix[MAXN][MAXN]; struct Vertex
{
int collected;
int totalDist;
int totalCost;
} gNodeTable[MAXN]; void InitMatrixAndTable()
{
int i,j;
for(i=0;i<MAXN;i++)
{
for(j=0;j<MAXN;j++)
{
gMatrix[i][j].dist=INFINITY;
gMatrix[i][j].cost=0;
}
gNodeTable[i].collected=FALSE;
gNodeTable[i].totalCost=INFINITY;
gNodeTable[i].totalDist=INFINITY;
}
} int FindNextVertex(int N)
{
int minIDX=ERROR;
int minDist=INFINITY;
int i;
for(i=0;i<N;i++)
{
if(gNodeTable[i].collected==FALSE)
{
if(minDist>gNodeTable[i].totalDist)
{
minIDX=i;
minDist=gNodeTable[i].totalDist;
}
}
}
return minIDX;
} void Dijkstra(int N,int S)
{
int i,j,vertex;
vertex=S;
gNodeTable[vertex].totalDist=0;
gNodeTable[vertex].totalCost=0;
while(vertex != ERROR)
{
gNodeTable[vertex].collected=TRUE;
for(i=0;i<N;i++)
{
if(gMatrix[vertex][i].dist==INFINITY)
continue;
if(gNodeTable[i].totalDist>gNodeTable[vertex].totalDist+gMatrix[vertex][i].dist)
{
gNodeTable[i].totalDist=gNodeTable[vertex].totalDist+gMatrix[vertex][i].dist;
gNodeTable[i].totalCost=gNodeTable[vertex].totalCost+gMatrix[vertex][i].cost;
}
if(gNodeTable[i].totalDist==gNodeTable[vertex].totalDist+gMatrix[vertex][i].dist)
{
if(gNodeTable[vertex].totalCost + gMatrix[vertex][i].cost < gNodeTable[i].totalCost)
{
gNodeTable[i].totalDist=gNodeTable[vertex].totalDist+gMatrix[vertex][i].dist;
gNodeTable[i].totalCost=gNodeTable[vertex].totalCost+gMatrix[vertex][i].cost;
} }
}
vertex=FindNextVertex(N);
}
} int main()
{
int i,v1,v2,dist,cost;
int N,M,S,D; //N节点数 M边数 S起点 D终点
scanf("%d %d %d %d",&N,&M,&S,&D);
InitMatrixAndTable();
for(i=0;i<M;i++)
{
scanf("%d %d %d %d",&v1,&v2,&dist,&cost);
gMatrix[v1][v2].dist=dist;
gMatrix[v1][v2].cost=cost;
gMatrix[v2][v1].dist=dist;
gMatrix[v2][v1].cost=cost;
}
Dijkstra(N,S);
printf("%d %d",gNodeTable[D].totalDist,gNodeTable[D].totalCost);
}
 

最新文章

  1. oracle 常用sql
  2. 安装 Dubbo 注册中心(Zookeeper-3.4.6)--单节点
  3. Spring学习4-面向切面(AOP)之schema配置方式
  4. HDU 2817 A sequence of numbers 整数快速幂
  5. --tags --follow-tags 的区别
  6. 20145129 《Java程序设计》第5周学习总结
  7. Struts2配置之Struts.properties
  8. input text输完自动跳到下一个
  9. OpenGL教程之碰撞检测与模型运动
  10. 编写高质量JavaScript代码的基本要点记录
  11. 阿里开源的热补丁框架AndFix使用教程
  12. idea取消double shift全局搜索
  13. Linux服务器GlashFish的Domain管理
  14. How to reset macOS Icon Cache
  15. IOT专用IOP平台
  16. vue 开发系列(三) vue 组件开发
  17. js实现四叉树算法
  18. PAT 1016 Phone Bills[转载]
  19. CodeForces765A
  20. sele nium 模块

热门文章

  1. Mysql-&gt;order by SQL 根据多个条件排序
  2. Android属性系统简介
  3. CSS-学习笔记五
  4. windows 操作系统种类
  5. iosopendev配置
  6. codeforces Gym 100338H High Speed Trains (递推,高精度)
  7. python中return和yield
  8. 在行列都排好序的矩阵中找数 【题目】 给定一个有N*M的整型矩阵matrix和一个整数K, matrix的每一行和每一 列都是排好序的。实现一个函数,判断K 是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返 回false。 【要求】 时间复杂度为O(N+M),额外空间复杂度为O(1)。
  9. idea快速生成实体类Entity
  10. Noip2011提高组 聪明的质监员