最小环问题(Floyd算法)

最小环问题: 在有向/无向图中,求构成的所有环中的权值和最小值。

当模板就行了,也不太难。
时间复杂度O(n3)

例题:寻找最小环 (无向图,把每条边存两次就行了,分别以u/v为起点)

#include
#define MAXN 105
#define INF 1000000000
#define ll long long
using namespace std;

ll n,m,ans=INF;
ll u,v,d;
ll dis[MAXN][MAXN],mp[MAXN][MAXN];

int main()
{
    cin>>n>>m;
    for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)if(i!=j){
        dis[i][j]=mp[i][j]=INF;
    }
    for(ll i=1;i<=m;i++){
        cin>>u>>v>>d;
        mp[u][v]=min(mp[u][v],d);
        mp[v][u]=min(mp[v][u],d);//无向图
        dis[u][v]=min(dis[u][v],d);
        dis[v][u]=min(dis[v][u],d);
    }
    for(ll k=1;k<=n;k++){
        for(ll i=1;i<k;i++)for(ll j=i+1;j<k;j++)
            ans=min(ans,dis[i][j]+mp[i][k]+mp[k][j]);
        for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++){
            dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            dis[j][i]=dis[i][j];//无向图
        }
    }
    if(ans==INF){cout<<"No solution.";}
    else cout<<ans;

    return 0;
}

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