標籤:des style java color os strong
最短路徑問題Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12105 Accepted Submission(s): 3668
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 21 2 5 62 3 4 51 30 0
Sample Output
9 11
Dijkstra演算法
#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;#define M 1005#define INF 99999int map[M][M],mat[M][M];int n,m;void Dijkstra(int s,int t){int i,j,k;int min;int d[M],l[M],v[M];for(i=1;i<=n;i++) {d[i]=map[s][i]; //距離l[i]=mat[s][i]; //費用}memset(v,0,sizeof(v));v[s]=1; for(i=1;i<n;i++) // 遍曆n-1個節點{min=INF;for(j=1;j<=n;j++){if(!v[j] && d[j] <min){min=d[j];k=j;}}v[k]=1;for(j=1;j<=n;j++){ if(!v[j] && d[j]>d[k]+map[k][j]) //距離和費用同時更新 {d[j]=d[k]+map[k][j];l[j]=l[k]+mat[k][j]; } else if(d[j]==d[k]+map[k][j]) {if(l[j]>l[k]+mat[k][j])l[j]=l[k]+mat[k][j]; }}}printf("%d %d\n",d[t],l[t]); }int main (){int a,b,d,p,s,t;int i,j;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0) break;for(i=1;i<=n;i++) //初始化for(j=1;j<=n;j++){map[i][j]=INF;mat[i][j]=INF;}for(i=0;i<m;i++){scanf("%d%d%d%d",&a,&b,&d,&p);if(map[a][b]>d){map[a][b]=map[b][a]=d;mat[a][b]=mat[b][a]=p;}else if(map[a][b]==d) // 路徑長度相同時,取最小費用if(mat[a][b]>p) mat[a][b]=mat[b][a]=p;}scanf("%d%d",&s,&t);Dijkstra(s,t); //起點和終點}return 0;}