最短路算法之Floyd算法

时间:2016/5/6(day6)

目标算法:Floyd算法

应用范围:最短路

算法思路:动态规划的思想,设有三点i,j,k,从i到k分为两种方法,一种为从i直接到k,另外一种是从i到j再到k。所以可以得到状态转移方程dis[I][k] = Min(dis[I][k],dis[I][j] + dis[j][k])。

算法实现:用邻接矩阵存图,分别用0和Inf初始化邻接矩阵,然后三重for循环遍历状态转移方程。如果dis[start][end] = Inf,则说明无法到达

时间复杂度:O(n^3)

oj测试:Hdu1874

测试结果:AC

算法代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 205;
const int Inf = 0x3f3f3f;
int map[maxn][maxn];
int x,y,z;
int n,m;

void init()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i == j)
                map[i][j] = 0;
            else
                map[i][j] = Inf;
        }
    }
}
int Floyd(int start,int end)
{
    for(int k=0;k<n;k++)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                map[i][j] = min(map[i][j],map[i][k] + map[k][j]);
        }
    }
    if(map[start][end] == 0)
        return 0;
    else if(map[start][end] == Inf)
        return -1;
    else
    return map[start][end];
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            if(map[x][y] > z)
                map[x][y] = map[y][x] = z;
        }
        int start,end;
        scanf("%d%d",&start,&end);
        int ans = Floyd(start,end);
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(Floyd算法)