对于floyd 拓展为什么可以判断 出最小环还是不是太理解
苟且 先贴下模版吧
感谢:心_随_梦_翔 的分析
http://hi.baidu.com/%D0%C4_%CB%E6_%C3%CE_%CF%E8/blog/item/403b9c58699c7642d0090675.html
感谢 我们一直在努力 的代码
http://www.cnblogs.com/zhaoguanqin/archive/2012/05/08/2490121.html
今天也够是郁闷的inf 开到 9 个 9 而中间 加法 导致溢出了 各种WA ,又找了一万晚上的错误
#include<stdio.h> #define N 110 #define inf 9999999 int dist[N][N],g[N][N],p[N][N]; int n,m,min,cnt,ans[N]; void floyd() { for(int k=1;k<=n;k++) { for(int i=1;i<k;i++) { for(int j=1;j<i;j++) { if(dist[i][j]+g[i][k]+g[k][j]<min) { min=dist[i][j]+g[i][k]+g[k][j]; int mid=j;cnt=0; while(mid!=i) { ans[cnt++]=mid; mid=p[i][mid]; } ans[cnt++]=i; ans[cnt++]=k; } } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(dist[i][j]>dist[i][k]+dist[k][j]) { dist[i][j]=dist[i][k]+dist[k][j]; p[i][j]=p[k][j]; } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { dist[i][j]=inf; g[i][j]=inf; p[i][j]=i; if(i==j) dist[i][i]=0,g[i][i]=0; } while(m--) { int u,v,c;scanf("%d%d%d",&u,&v,&c); if(c<g[u][v]) { g[u][v]=g[v][u]=c; dist[u][v]=dist[v][u]=c; } } min=inf; floyd(); if(min==inf) puts("No solution."); else { printf("%d",ans[0]); for(int i=1;i<cnt;i++) printf(" %d",ans[i]); printf("\n"); } return 0; }