参考来自:
http://hi.baidu.com/%D0%C4_%CB%E6_%C3%CE_%CF%E8/blog/item/403b9c58699c7642d0090675.html
/*
floyd 的扩展 找最小环
*/
#include<stdio.h>
#define maxn 200
#define inf 0xffffff
int n,m;
int dis[maxn][maxn],g[maxn][maxn],path[maxn],pre[maxn][maxn];
int min,cnt,mid;
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<k;i++)//为了避免重复
{
for(j=1;j<i;j++)
{
if(dis[i][j]+g[i][k]+g[k][j]<min)//找到更优解
{
min=dis[i][j]+g[i][k]+g[k][j];
cnt=0;
mid=j;
while(mid!=i)//逆向寻找前驱结点直到找到最前面的i,i->…->j
{
path[cnt++]=mid;
mid=pre[i][mid];
}
path[cnt++]=i;
path[cnt++]=k;
}
}
}
//求最短路
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
pre[i][j]=pre[k][j];//更新前驱
}
}
}
}
}
int main()
{
int i,j,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
dis[i][j]=inf;
g[i][j]=inf;
pre[i][j]=i;
}
dis[i][i]=g[i][i]=0;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<dis[a][b])
{
dis[b][a]=dis[a][b]=c;
g[a][b]=g[b][a]=c;
}
}
min=inf;
floyd();
if(min==inf)printf("No solution.\n");
else {
printf("%d",path[0]);
for(i=1;i<cnt;i++)
{
printf(" %d",path[i]);
}
printf("\n");
}
}
}