首页 > 代码库 > 最短路径问题

最短路径问题

 

时间限制: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=http://www.mamicode.com/mx[i][j].cost=INF;26                 for(i=0;i<m;++i)27                 {28                       cin>>a>>b>>dd>>p;29                       mx[a][b].data=http://www.mamicode.com/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 }

 

最短路径问题