最短路径问题

 

时间限制: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 }

 

你可能感兴趣的:(最短路径)