藍橋杯之最短路問題


問題描述
給定一個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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM