• dinic算法实现


    今天代码实现时,发现我昨天的理解有一个误区:
    分层图是要不断建立的,而不是建一次就够了。

    下面贴出我的代码(不得不说,用链式前向星存图真是方便)

    [cpp] view plain copy
     
    1. #include<iostream>  
    2. #include<cstring>  
    3. #include<cstdio>  
    4. using namespace std;  
    5. int m,n,ne=0;  
    6. struct node  
    7. {  
    8.     int to,next,w;  
    9. }edge[233];  
    10.  int head[233];  
    11.  int dis[233];  
    12. void add(int u,int v,int c)  
    13. {  
    14.     ne++;  
    15.     edge[ne].to=v;  
    16.     edge[ne].next=head[u];  
    17.     edge[ne].w=c;  
    18.     head[u]=ne;  
    19.     return;  
    20. }//用链式前向星存图   
    21. int q[233];  
    22. bool bfs()  
    23. {  
    24.     int i,j,h,r;  
    25.     memset(dis,0xff,sizeof(dis));  
    26.     dis[1]=0;h=0;r=1;  
    27.     q[0]=1;  
    28.     while(h<r)  
    29.     {  
    30.          int now=q[h];h++;  
    31.          i=head[now];  
    32.          while(i)  
    33.          {  
    34.                 if(edge[i].w&&dis[edge[i].to]<0)  
    35.                 {  
    36.                     q[r++]=edge[i].to;  
    37.                     dis[edge[i].to]=dis[now]+1;  
    38.                 }  
    39.                 i=edge[i].next;  
    40.         }  
    41.      }  
    42.      if(dis[n]>0)  
    43.        return 1;  
    44.     else   
    45.         return 0;  
    46. }  
    47.   
    48. int find(int x,int low)  
    49. {  
    50.     if(x==n) return low;  
    51.     int i=head[x];  
    52.     int w,used=0;  
    53.     while(i)  
    54.     {  
    55.         if(edge[i].w&&dis[edge[i].to]==dis[x]+1)  
    56.         {  
    57.             w=low-used;  
    58.             w=find(edge[i].to,min(w,edge[i].w));  
    59.             edge[i].w-=w;  
    60.             edge[i+1].w+=w;  
    61.             used+=w;  
    62.             if(used==low) return low;  
    63.         }  
    64.         i=edge[i].next;  
    65.     }  
    66.     if(!used) dis[x]=-1;  
    67.     return  used;  
    68. }  
    69. int main()  
    70. {  
    71.     int u,v,c;  
    72.     scanf("%d%d",&n,&m);  
    73.     for(int i=1;i<=m;i++)  
    74.     {  
    75.         scanf("%d%d%d",&u,&v,&c);  
    76.         add(u,v,c);  
    77.         add(v,u,c);  
    78.     }  
    79.     int ans=0,tans;  
    80.     while(bfs())  
    81.     {  
    82.         while(tans=find(1,0x7fffffff)) ans+=tans;  
    83.     }  
    84.     printf("%d ",ans);  
    85.     return 0;  
    86. }   


    ————————完结撒花——————————————————————————2016/8/22————————

  • 相关阅读:
    IP掩码的作用
    linux shell 笔记
    ubuntu apt-get Failed to fetch Temporary failure resolving 'security.ubuntu.com'
    ubuntu 16.04 & 18.04 远程桌面使用
    取消Ubuntu开机硬盘自检
    linux shell 脚本输入参数解析
    Ubuntu 16.04 + python3 源码 安装+使用labelImg最新版
    用tinyxml2读写xml文件_C++实现
    常用工具问题及解决方案
    可视化调试工具
  • 原文地址:https://www.cnblogs.com/LQ-double/p/5971329.html
Copyright © 2020-2023  润新知