1.問題
図を解決するための各頂点の最短距離とフロイドのアルゴリズム。書き込みアルゴリズムとフロイドの擬似コード所与の距離行列(頂点間マトリックスの最短距離)
2.解析
都市部の高速道路上で4〜8の図がありますが、道路上の数字は、この道の長さを示しています。これらの道路は一方通行であることに注意してください。私たちは今、任意の2点間の最短経路である任意の2つの都市間の最短距離を、要求します。この問題は、「マルチソース最短パス」問題として知られています。
今、あなたは店舗情報のデータ構造へのマップを必要とする、我々はまだ店に行列(2次元配列e)4 * 4を使用することができます。2号都市都市実行する実施例1は、次に2.2市内番号4のE [1]〜[2]の値が∞の街、集合E [2] [4]の値に達していないせ、2です。また、ここでは、自分の街に大会には、例えば、また0で、E [1] [1]は0です。
第三のポイント(頂点K)の唯一の導入、あなたがしたい場合は、私たちの経験によると、任意の2点(頂点Bに頂点から例えば、ポイント)間の距離が短くなり、程度、およびによってレッツ・シンクタンクトランジットすなわちA-> K-> B頂点kは、頂点からの距離の頂点bに原点を短縮することができます。そして、トランジット頂点kを1〜nは、その時点でそれで?そして、時には複数の点ずつ、しかし、転送ポイントの2つの以上のポイントの後に短い、すなわち、A-> k1-> k2b->またはA-> k1-> K2 ... - > K-> I ... - > B。このような3 [4] [3]都会(> 3 4-)離れE 4に上記のように図から、元々は12でした。1番(4-> 1-> 3)を介してのみ都市交通は、距離は11(E [4] [1] + E [1]〜[3] = 5 + 6 = 11)に短縮されている場合。実際には、1番街の3都市は、図5(e [1] [2] + E [2] [3] = 2 + 3 = 5に短縮街からそう1番その番号3に、第2号都市輸送を介してもよいです)。したがって、その後、2つの都市走行を介して1と2の両方の場合に、さらに10まで減少街から3〜4都市から。この例では、我々は各頂点の距離が短くなる他の二つの頂点の間で可能であることがわかります。
3.デザイン
1. #include
2. int main()
3. {
4. int e[10][10],k,i,j,n,m,t1,t2,t3;
5. int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
6.
7. //读入n和m,n表示顶点个数,m表示边的条数
8. scanf("%d %d",&n,&m);
9.
10. //初始化
11. for(i=1;i<=n;i++)
12. for(j=1;j<=n;j++)
13. if(i==j)
14. e[i][j]=0;
15. else
16. e[i][j]=inf;
17.
18. //读入边
19. for(i=1;i<=m;i++)
20. {
21. scanf("%d %d %d",&t1,&t2,&t3);
22. e[t1][t2]=t3;
23. }
24.
25. //Floyd-Warshall算法核心语句
26. for(k=1;k<=n;k++)
27. for(i=1;i<=n;i++)
28. for(j=1;j<=n;j++)
29. if(e[i][j]>e[i][k]+e[k][j] )
30. e[i][j]=e[i][k]+e[k][j];
31.
32. //输出最终的结果
33. for(i=1;i<=n;i++)
34. {
35. for(j=1;j<=n;j++)
36. {
37. printf("%10d",e[i][j]);
38. }
39. printf("\n");
40. }
41.
42. return 0;
43. }
4.送信元アドレス
https://github.com/Lin02993/-