zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    移动端Web 关于单位rem的使用小结
    psp工具需求分析
    c#制作计算器全过程
    需求分析
    为石家庄的蓝天发的第一篇博文
    ASP.NET Core 应用发布与部署指南
    开博有感
    准备开始添加博客
    深挖UITableViewCell-编辑多选模式下,引发的深思
    AFNetworking 报错3840...
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2608935.html
Copyright © 2011-2022 走看看