大意:一个无向有环图,求最小环,并输出路径
好吧。我是看着题解做的,,自己想想还真想不到floyd可以求环,。。
#include<iostream>
#include<map>
#include<stdio.h>
#include<algorithm>
#include<set>
#include<string.h>
#include<string>
#include<vector>
#define MX 111
#define INF 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define FIN freopen("input.txt","r",stdin)
using namespace std;
int G[MX][MX];
int d[MX][MX],n,m,path[MX][MX];
vector<int> ans;
int floyd()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) path[i][j]=i;
int minn=INF,cnt=0;
for(int k=1; k<=n; k++)
{
for(int i=1; i<=k-1; i++)
if(G[i][k]!=INF)for(int j=1; j<=i-1; j++) if(G[k][j]!=INF)
{
int tmp=d[i][j]+G[i][k]+G[k][j];
if(tmp<minn)
{
ans.clear();
minn=tmp;
int p=j;
while(p!=i)ans.push_back(p),p=path[i][p];
ans.push_back(i);
ans.push_back(k);
}
}
for(int i=1; i<=n; i++)
if(i!=k)for(int j=1; j<=i-1; j++)
if(j!=k)
{
int tmp=d[i][k]+d[k][j];
if(tmp<d[i][j])
{
d[j][i]=d[i][j]=tmp;
path[i][j]=path[k][j];
path[j][i]=path[k][i];
}
}
}
return minn;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
mem(G,0x3f);
mem(d,0x3f);
for(int i=1,a,b,x; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&x);
G[b][a]=G[a][b]=d[a][b]=d[b][a]=min(G[a][b],x);
}
int t=floyd();
if(t==INF) puts("No solution.");
else for(int i=0; i<ans.size(); i++) printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
}
return 0;
}