問題描述
給定一個n個頂點,m條邊的有向圖(其中某些邊權可能為負,但保證沒有負環)。請你計算從1號點到其他點的最短路(頂點從1到n編號)。
輸入格式
第一行兩個整數n, m。
接下來的m行,每行有三個整數u, v, l,表示u到v有一條長度為l的邊。
輸出格式
共n-1行,第i行表示1號點到i+1號點的最短路。
樣例輸入
3 3
1 2 -1
2 3 -1
3 1 2
樣例輸出
-1
-2
數據規模與約定
對於10%的數據,n = 2,m = 2。
對於30%的數據,n <= 5,m <= 10。
對於100%的數據,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保證從任意頂點都能到達其他所有頂點。
算法分析:
本題中的圖因為有負邊,因此只能使用BF或者floyd算法。
這里選用floyd算法,注意本題中的INF INT_MAX/10是為了防止溢出
代碼:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<limits.h> 5 #define MAXN 20005 6 #define INF INT_MAX/10 7 int d[MAXN][MAXN]; 8 int V,E; 9 int min(int x,int y){ 10 return x<y?x:y; 11 } 12 void floyd(){ 13 for(int k=1;k<=V;k++) 14 for(int i=1;i<=V;i++) 15 for(int j=1;j<=V;j++) 16 d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 17 } 18 int main() 19 { 20 int u,v; 21 scanf("%d%d",&V,&E); 22 for(int i=1;i<=V;i++) 23 for(int j=i+1;j<=V;j++){ 24 d[i][j]=d[j][i]=INF; 25 } 26 27 for(int i=1;i<=E;i++){ 28 scanf("%d%d",&u,&v); 29 scanf("%d",&d[u][v]); 30 } 31 floyd(); 32 for(int i=2;i<=V;i++){ 33 if(d[1][i]!=INF) 34 printf("%d\n",d[1][i]); 35 } 36 return 0; 37 }