最小环 Floyd

  只适用于无向图,而且复杂度有点高O(n^3),但是我还是蛮喜欢这个算法的qwq……

  简单易懂(或许这就是喜欢的原因>\\\<),就只给代码啦~  -^-

#include<cstdio>
#include<cstring>
#include<iostream> 
using namespace std;
#define maxn 1e8
int ans=maxn,g[100][100],d[100][100],n,m;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        g[i][j]=maxn;
        d[i][j]=maxn;
    } 
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        g[a][b]=c;
        g[b][a]=c;
        d[a][b]=c;
        d[b][a]=c;
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=k-1;i++)
        for(int j=i+1;j<=k-1;j++)
            ans=min(ans,d[i][j]+g[j][k]+g[k][i]);
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
    }
    printf("%d",ans);
    return 0;
} 

  小注解:

    k可以理解为点,每一次只要考虑这个点有没有对现有的最优答案有益即可。

posted @ 2018-11-26 19:41  paopo  阅读(143)  评论(0编辑  收藏  举报