最小环问题

/*
1.删边法:把边删去后,查找最小值

2.floyd:
首先是肯定枚举到了所有的组合
无向图最小环,先确定两个点之间的最短路,并且一定没有经过第三个点,然后在以经过第三个点
*/
#include <bits/stdc++.h>
using namespace std;
const int N=110,inf=1e8;

int n,m;
int g[N][N],dis[N][N];
int ans=inf;
void floyd() {
    for(int k=1;k<=n;k++) {
        for(int i=1;i<k;i++)for(int j=i+1;j<k;j++)
                ans=min(ans,dis[i][j]+g[j][k]+g[k][i]);
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
            dis[i][j]=dis[j][i]=min(dis[i][j],dis[i][k]+dis[k][j]);
    }
}

int main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=inf;
    for(int i=1;i<=n;i++)g[i][i]=0;
    while(m--) {
        int x,y,wi;
        cin>>x>>y>>wi;
        g[x][y]=g[y][x]=min(g[x][y],wi);
    }
    memcpy(dis,g,sizeof(g));
    floyd();
    if(ans==inf)puts("No solution.");
    else cout<<ans<<endl;
    return 0;
}

posted @ 2023-04-21 13:40  basicecho  阅读(28)  评论(0)    收藏  举报