标签:
floyd算法和之前讲的bellman算法、dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法,只不过它的时间复杂度高,为o(v^3),用的时候需要谨慎。
floyd的精髓部分在于实现其思想的三个for循环,而它的主要思想:如果存在一个点k,使得dis[s][t]<dis[s][k]+dis[k][t],那么我们就更新dis[s][t]。
#include<iostream>//floyd_warshall算法
#include<algorithm>
#define INF 10000000
using namespace std;
int dis[100][100];
void floyd_warshall(int v)
{
for(int k=1;k<=v;k++)//第三点k必须为第一重循环
    for(int i=1;i<=v;i++)
        for(int j=1;j<=v;j++)
            {
               dis[i][j]= min(dis[i][j],dis[i][k]+dis[k][j]);
               //cout << i << "   " << j << "   " << dis[i][j] << endl;
            }
}
void solve()
{
    int v,e;
    cin >> v >> e;
    for(int j=1;j<=v;j++)
        for(int k=1;k<=v;k++)
        {
            if(j==k) dis[j][k]=0;
            else
            dis[j][k]=INF;
        }
    for(int i=0;i<e;i++)
    {
        int s1,t1,c1;
        cin >> s1 >> t1 >> c1;
        dis[s1][t1]=c1;
    }
    floyd_warshall(v);
    int s,t;
    cin >> s >> t;
    cout << dis[s][t] << endl;
}
int main()
{
    solve();
    return 0;
}
标签:
原文地址:http://www.cnblogs.com/celavia-std/p/4677253.html