hdu3790:最短路徑問題
阿新 • • 發佈:2018-11-05
Problem Description
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。
Input
輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t;起點s,終點。n和m為0時輸入結束。
(1<n<=1000, 0<m<100000, s != t)
Output
輸出 一行有兩個數, 最短距離及其花費。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
這道題可以用求最短路的方法來求,但是兩個地方的路可能有多條,所以應該先找出兩個地方距離最短,距離相同時再找出花費最少的。
#include<stdio.h> #include<string.h> #define N 1020 int e[N][N],cos[N][N],book[N],dis[N],cs[N]; int main() { int a,b,d,p,i,j,k,n,m,s,t,min,u,v; int intf=99999999; while(scanf("%d %d",&n,&m)!=EOF) { if(m==0&&n==0) break; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) e[i][j]=cos[i][j]=0; else e[i][j]=e[j][i]=cos[i][j]=cos[j][i]=intf; for(i=0;i<m;i++) { scanf("%d %d %d %d",&a,&b,&d,&p); if(d<e[a][b]) { e[a][b]=e[b][a]=d; cos[a][b]=cos[b][a]=p; } if(d==e[a][b]) cos[a][b]=cos[b][a]=p; } scanf("%d %d",&s,&t); for(i=1;i<=n;i++) book[i]=0; book[s]=1; for(i=1;i<=n;i++) { dis[i]=e[s][i]; cs[i]=cos[s][i]; } for(i=1;i<=n-1;i++) { min=intf; for(j=1;j<=n;j++) { if(book[j]==0&&dis[j]<min) { min=dis[j]; u=j; } } book[u]=1; for(v=1;v<=n;v++) { if(e[u][v]<intf) { if(dis[v]>dis[u]+e[u][v]) { dis[v]=dis[u]+e[u][v]; cs[v]=cs[u]+cos[u][v]; } if(dis[v]==dis[u]+e[u][v]&&cs[v]>cs[u]+cos[u][v]) cs[v]=cs[u]+cos[u][v]; } } } printf("%d %d\n",dis[t],cs[t]); } return 0; }