【アハアルゴリズム]フロイド・ウォーシャル

問題の説明

Input
最初の4つの行数nは、mは、n個の頂点の数を示し、mはエッジの数を表します。
続いて行をM、各列が3つの数字T1、T2及びT3を有し、t1は頂点距離に頂点T2 T3で表します。そのこれらのT1-> T2と単方向に注意してください。
Output
* Nの行列を出力するn個、n行目のn番目の列は、n点nまでの距離を表します。二つの数値間の各ラインのスペースで区切られたSample Input
5 8
1 2 2
2 3 3
3 4 4
4 5 5
5 3 3
3 1 4
2 5 7
。1 5 10
Sample Output
0 2 5 9 9
。7 7 7 3 0
4 0 6 4 9
12 0.8 14 5である
。7. 9 3 7 0
More Info
無しOHブランク各出力ラインの最後の桁の後

アルゴリズム

当任意两点之间不允许经过第三个点时,这些城市之间最短路程就是初始路程。
假如现在只允许经过1号顶点,求任意两点之间的最短路程,应该如何求呢?只需判断e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是从i号顶点到j号顶点之间的路程。e[i][1]+e[1][j]表示的是从i号顶点先到1号顶点,再从1号顶点到j号顶点的路程之和。其中i是1~n循环,j也是1~n循环,代码实现如下
for(i=1;i<=n;i++)
{
    for(j=1;j<=n;j++)
    {
        if ( e[i][j] > e[i][1]+e[1][j] )
              e[i][j] = e[i][1]+e[1][j];
    }
}

2つだけの頂点にコード通過を可能にする場合、以下の:

//经过1号顶点
for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        if (e[i][j] > e[i][1]+e[1][j])  e[i][j]=e[i][1]+e[1][j];
//经过2号顶点
for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        if (e[i][j] > e[i][2]+e[2][j])  e[i][j]=e[i][2]+e[2][j];

コアコードのみ五行:

for(k=1;k<=n;k++)
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(e[i][j]>e[i][k]+e[k][j])
                 e[i][j]=e[i][k]+e[k][j];

それは、一つの文章に要約されます。最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转……允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。

  • 私の出発都市
  • jは都市に到達します
  • k個のトランジット市

すべてのコード

#include <iostream>
using namespace std;

int main()
{
    int datas[105][105];
    int n,m;
    int t1,t2,t3;
    const int inf = 99999;
    cin >> n >> m;
    // 初始化矩阵
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j){
                datas[i][j] = 0;
            }else{
                datas[i][j] = inf;
            }
        }
    }

    // 输入边
    for(int i=1;i<=m;i++){
        cin >> t1 >> t2 >> t3;
        datas[t1][t2] = t3;
    }
    // 核心算法
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(datas[i][j] > datas[i][k] + datas[k][j]){
                    datas[i][j] = datas[i][k] + datas[k][j];
                }
            }
        }
    }
    // 打印结果
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(j!=n)
                cout << datas[i][j] << " ";
            else
                cout << datas[i][j] << endl;
        }
    }
    return 0;
}
公開された31元の記事 ウォン称賛13 ビュー9882

おすすめ

転載: blog.csdn.net/qq_43497702/article/details/103992746