pat06-图5. 旅游规划(25)
06-图5. 旅游规划(25)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入格式说明:
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。
输出格式说明:
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。
样例输入与输出:
序号 | 输入 | 输出 |
1 |
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 |
2 |
2 1 0 1 1 0 2 3 |
2 3 |
方法一:邻接矩阵,时间复杂度O(N^2)
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 #include<cmath> 8 #include<string> 9 using namespace std; 10 #define inf 260000 11 struct node{ 12 int dist,cost; 13 }; 14 node Map[505][505]; 15 int dist[505],cost[505],n,m,s,d; 16 int main(){ 17 //freopen("D:\\INPUT.txt","r",stdin); 18 scanf("%d %d %d %d",&n,&m,&s,&d); 19 20 //cout<<n<<" "<<m<<" "<<s<<" "<<d<<endl; 21 22 int i,j,a,b,dis,cos; 23 for(i=0;i<n;i++){//初始化 24 dist[i]=inf; 25 cost[i]=inf; 26 for(j=0;j<n;j++){ 27 Map[i][j].dist=Map[j][i].dist=inf; 28 Map[i][j].cost=Map[j][i].cost=inf; 29 } 30 } 31 for(i=0;i<m;i++){ 32 scanf("%d %d %d %d",&a,&b,&dis,&cos); 33 Map[a][b].cost=Map[b][a].cost=cos; 34 Map[a][b].dist=Map[b][a].dist=dis; 35 36 //cout<<a<<" "<<b<<" "<<cos<<" "<<dis<<endl; 37 38 } 39 int cur=s,mindist=inf,mincost=inf,minnum; 40 dist[s]=cost[s]=0; 41 while(cur!=d){ 42 43 //cout<<dist[cur]<<endl; 44 45 for(i=0;i<n;i++){ 46 if(dist[i]>dist[cur]+Map[cur][i].dist){ 47 dist[i]=dist[cur]+Map[cur][i].dist; 48 cost[i]=cost[cur]+Map[cur][i].cost; 49 } 50 else{ 51 if(dist[i]==dist[cur]+Map[cur][i].dist&&cost[i]>cost[cur]+Map[cur][i].cost){ 52 cost[i]=cost[cur]+Map[cur][i].cost; 53 } 54 } 55 } 56 dist[cur]=cost[cur]=0;//入队 57 mindist=inf,mincost=inf; 58 for(i=0;i<n;i++){//find min 59 if(dist[i]){ 60 if(mindist>dist[i]){ 61 mindist=dist[i]; 62 mincost=cost[i]; 63 minnum=i; 64 } 65 else{ 66 if(mindist==dist[i]&&mincost>cost[i]){ 67 mincost=cost[i]; 68 minnum=i; 69 } 70 } 71 } 72 } 73 cur=minnum; 74 } 75 printf("%d %d\n",dist[d],cost[d]); 76 return 0; 77 }