Floyd求最小环模板
http://acm.hdu.edu.cn/showproblem.php?pid=1599
网上找到的Floyd求最小环模板
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int Ni=105; 5 const int INF=10000000; 6 7 int dist[Ni][Ni],g[Ni][Ni]; 8 int fa[Ni][Ni],path[Ni]; 9 10 int n,m,num,minc; 11 12 void Floyd() 13 { 14 int i,j,k,p,tmp; 15 minc=INF; 16 for(k=1;k<=n;k++) 17 { 18 for(i=1;i<k;i++) 19 for(j=i+1;j<k;j++) 20 { 21 tmp=dist[i][j]+g[i][k]+g[k][j]; 22 if(tmp<minc) //找到更优解 23 { 24 minc=tmp; 25 num=0; 26 p=j; 27 while(p!=i) //逆向寻找前驱结点直到找到最前面的i,i->…->j 28 { 29 path[num++]=p; 30 p=fa[i][p];//fa[i][j]保存的不是k,而是fa[k][j]. 31 } 32 path[num++]=i; 33 path[num++]=k; 34 } 35 } 36 for(i=1;i<=n;i++) 37 for(j=1;j<=n;j++) 38 { 39 tmp=dist[i][k]+dist[k][j]; 40 if(dist[i][j]>tmp) 41 { 42 dist[i][j]=tmp; 43 fa[i][j]=fa[k][j]; 44 } 45 } 46 } 47 } 48 49 int main() 50 { 51 int i,j,u,v,w; 52 while(~scanf("%d%d",&n,&m)) 53 { 54 for(i=1;i<=n;i++) 55 for(j=1;j<=n;j++) 56 { 57 g[i][j]=INF; 58 dist[i][j]=INF; 59 fa[i][j]=i; 60 } 61 for(i=1;i<=m;i++) 62 { 63 scanf("%d%d%d",&u,&v,&w); 64 w=min(g[u][v],w); //处理重边 65 g[u][v]=g[v][u]=dist[u][v]=dist[v][u]=w; 66 } 67 Floyd(); 68 if(minc==INF) 69 printf("It's impossible.\n"); 70 else 71 { 72 printf("%d\n",minc); 73 /*printf("%d",path[0]); 74 for(i=1;i<num;i++) 75 printf(" %d",path[i]); 76 printf("\n");*/ 77 } 78 } 79 return 0; 80 }