题解 P6175 【无向图的最小环问题】

珈乐唯毒

2020-05-21 10:08:40

Solution

本题应该使用floyd算法 ~~(因为标签里有呢)~~ 算法思路:在Floyd算法的计算过程中,我们可以取小于k的两个节点i,j。若i,j与k之间均有边,则存在一个可能的最小环 i-j-k (因为i,j之间的路径长度为只经过1-(k-1)号节点的最短路径)。 ![](https://cdn.luogu.com.cn/upload/image_hosting/em2ycp6e.png) 代码如下: ``` #include<bits/stdc++.h> using namespace std; int n,m,s,a,b,w; int d[1005][1005],g[1005][1005],ans; int main(){ cin>>n>>m; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j)d[i][j]=10000000; ans=10000000; for(int i=1;i<=m;i++){ cin>>a>>b>>w; if(a==b)continue; if(g[a][b]==0)g[a][b]=w; g[a][b]=min(g[a][b],w); g[b][a]=g[a][b]; d[a][b]=g[a][b]; d[b][a]=g[a][b];//存无向图 } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j&&g[i][k]>0&&g[k][j]>0)ans=min(ans,d[i][j]+g[i][k]+g[k][j]); if(d[i][k]+d[k][j]<d[i][j])d[i][j] = d[i][k]+d[k][j]; } } } if(ans!=10000000)cout<<ans; else cout<<"No solution."; return 0; } ```