题意:
有一个无向图内的最小环。
思路:
求最小环的模板题。
代码:
#include<iostream>
using namespace std;
const int maxN=128;
int g[maxN][maxN];
int directConnect[maxN][maxN];
int passPoint[maxN][maxN];
int path[maxN];
int ans;
int n,m,cnt;
void findPath(int i,int j)
{
if(passPoint[i][j]==-1){
path[cnt++]=j;
return ;
}
int interPoint=passPoint[i][j];
findPath(i,interPoint);
findPath(interPoint,j);
return ;
}
int main()
{
memset(g,-1,sizeof(g));
memset(passPoint,-1,sizeof(passPoint));
memset(directConnect,-1,sizeof(directConnect));
scanf("%d%d",&n,&m);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(g[a][b]==-1||g[a][b]>c){
g[a][b]=g[b][a]=c;
directConnect[a][b]=c;
directConnect[b][a]=c;
}
}
int i,j,k;
ans=INT_MAX;
for(k=1;k<=n;++k){
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(i!=k&&i!=j&&j!=k)
if(directConnect[i][k]!=-1&&directConnect[k][j]!=-1&&g[i][j]!=-1)
if(ans>directConnect[i][k]+directConnect[k][j]+g[i][j]){
ans=directConnect[i][k]+directConnect[k][j]+g[i][j];
cnt=0;
path[cnt++]=i;
findPath(i,j);
path[cnt++]=k;
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(i!=k&&i!=j&&j!=k)
if(g[i][k]!=-1&&g[k][j]!=-1)
if(g[i][j]==-1||g[i][k]+g[k][j]<g[i][j]){
g[i][j]=g[i][k]+g[k][j];
passPoint[i][j]=k;
}
}
if(ans==INT_MAX)
printf("No solution.");
else
for(i=0;i<cnt;++i)
printf("%d%c",path[i],i==cnt-1?'\n':' ');
return 0;
}
本文介绍了一种求解无向图中最小环的算法实现,通过Floyd算法进行路径松弛,寻找最短环路,并提供了完整的C++代码示例。

239

被折叠的 条评论
为什么被折叠?



