1. 程式人生 > >多源最短路(floyd演算法)

多源最短路(floyd演算法)

Floyd適用無向圖和有向圖,不適用於帶負權的圖  

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n , m;
int a[105][105];
const int inf = 999999;
int main(void)
{
    int from , to , val;
    scanf("%d %d" , &n , &m);
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 1 ; j <= n ; j ++)
        {
            if(i == j)
                a[i][j] = 0;
            else
                a[i][j] = inf;
        }
    }//對圖進行初始化
    for(int i = 1 ; i <= m ; i ++)
    {
        scanf("%d %d %d",&from,&to,&val);
        a[from][to] = val;
    }輸入邊權值

    //floyd核心演算法
    for(int k = 1 ; k <= n ; k ++)
    {
        for(int i = 1 ; i <= n ; i ++)
        {
            for(int j = 1 ; j <= n ; j ++)
            {
                if(a[i][j] > a[i][k] + a[k][j])
                    a[i][j] = a[i][k] + a[k][j];
            }
        }
    }
    //輸出圖(任意兩點的最短距離)
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= n ; j ++)
        {
            printf("%10d",a[i][j]);
        }
        cout<<endl;
    }

}

丟一組測試資料:

4 8

1 2 2

1 3 6

1 4 4

2 3 3

3 1 7

3 4 1

4 1 5

4 3 12