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 }

 

posted @ 2015-08-25 01:37  Deribs4  阅读(675)  评论(0编辑  收藏  举报