最短路径问题

 

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5480

解决:1757

题目描述:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
输出:
输出 一行有两个数, 最短距离及其花费。
来源:
2010年浙江大学计算机及软件工程研究生机试真题



 
 1 #include <iostream>
 2 using namespace std;
 3 int INF=99999999;
 4  
 5 struct lnode{
 6         int data;
 7         int cost;
 8 };
 9  
10 lnode mx[1001][1001];
11  
12 int main()
13 {
14         int i,j;
15         int n,m,a,b,dd,p,s,t;
16         int v[1001],d[1001],c[1001];//v 是否访问过  d【i】 起点开始到i的最短距离   c【i】  花费
17  
18  
19         while(cin>>n)
20         {
21    cin>>m;
22                 if(n==0 && m==0) break;
23                 for(i=1;i<=n;++i)
24                         for(j=1;j<=n;++j)
25                                 mx[i][j].data=mx[i][j].cost=INF;
26                 for(i=0;i<m;++i)
27                 {
28                       cin>>a>>b>>dd>>p;
29                       mx[a][b].data=mx[b][a].data=dd;
30                       mx[a][b].cost=mx[b][a].cost=p;
31                     
32                 }
33                 cin>>s>>t;
34  
35                 for(i=1;i<=n;++i) v[i]=0;
36                 
37  
38                 for(i=1;i<=n;++i)
39                         c[i]=d[i]=(i==s?0:INF);//从s开始
40  
41  
42                 for(i=0;i<n;++i)
43                 {
44                         int x,m=INF;//选点
45                         for(j=1;j<=n;++j)
46                            if(!v[j] && d[j]<m)  
47 {
48   m=d[j];
49        x=j;
50   }
51                       
52   v[x]=1;//入点
53  
54  
55                         for(j=1;j<=n;j++)//更新
56                         {
57                                         if(d[j]>=d[x]+mx[x][j].data)
58                                         {
59                                                 d[j]=d[x]+mx[x][j].data;
60                                                 if(c[j]>c[x]+mx[x][j].cost)  
61 c[j]=c[x]+mx[x][j].cost;
62                                         }
63                         }
64                 }
65                cout<<d[t]<<" "<<c[t]<<endl;
66         }
67         return 0;
68 }
原文地址:https://www.cnblogs.com/xiaoyesoso/p/4265125.html