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 }

 

你可能感兴趣的:(floyd)