时间限制: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)
- 输出:
-
输出 一行有两个数, 最短距离及其花费。
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 }