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 }

 

posted @ 2012-07-25 20:50  qijinbiao1  阅读(873)  评论(0编辑  收藏  举报