• 图论:Dinic算法


    解决最大流问题我搜到了一堆的算法:EK算法、FF算法、Dinic算法、SAP算法、ISAP算法

    然而并没有什么鸟用

    掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些。。我当不知道好了

    模板题Codevs1993

    给定源点汇点,求从源点走到汇点的所有流量和,最大流就是求最大值了

    建图直接Dinic下面给代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=505;
     6 const int INF=0x7fffffff;
     7 int n,m,cnt=1,ans;
     8 int g[maxn],q[maxn],h[maxn];
     9 struct Edge{int t,next,v;}e[maxn];
    10 void addedge(int u,int v,int w)
    11 {
    12     e[++cnt].t=v;e[cnt].next=g[u];
    13     g[u]=cnt;e[cnt].v=w;
    14 }
    15 bool bfs()
    16 {
    17     memset(h,-1,sizeof(h));
    18     int t=0,w=1,u;
    19     q[t]=1;h[1]=0;
    20     while(t!=w)
    21     {
    22         u=q[t];t++;
    23         if(t==501) t=0;
    24         for(int tmp=g[u];tmp;tmp=e[tmp].next)
    25         {
    26             if(e[tmp].v&&h[e[tmp].t]==-1)
    27             {
    28                 h[e[tmp].t]=h[u]+1;
    29                 q[w++]=e[tmp].t;
    30                 if(w==501) w=0;
    31             }
    32         }
    33     }
    34     if(h[n]==-1) return 0;
    35     return 1;
    36 }
    37 int dfs(int x,int f)
    38 {
    39     if(x==n) return f;
    40     int w,used=0;
    41     for(int tmp=g[x];tmp;tmp=e[tmp].next)
    42     {
    43         if(e[tmp].v&&h[e[tmp].t]==h[x]+1)
    44         {
    45             w=dfs(e[tmp].t,min(f-used,e[tmp].v));
    46             used+=w;e[tmp].v-=w;e[tmp^1].v+=w;
    47             if(used==f) return f;
    48         }
    49     }
    50     if(!used) h[x]=-1;
    51         return used;
    52 }
    53 void dinic()
    54 {
    55     while(bfs()) ans+=dfs(1,INF);
    56 }
    57 int main()
    58 {
    59     scanf("%d%d",&m,&n);
    60     int x,y,z;
    61     for(int i=1;i<=m;i++)
    62     {
    63         scanf("%d%d%d",&x,&y,&z);
    64         addedge(x,y,z);
    65         addedge(y,x,0);
    66     }
    67     dinic();
    68     printf("%d",ans);
    69     return 0;
    70 }

    注意Edge里面的v是容量,还有建图的时候要注意一下怎么建的

    别的就是直接求就好了

  • 相关阅读:
    职位晋升的潜规则
    mybatis中的多对多的查询
    mybatis的自关联查询
    Git使用步骤
    Junit测试出现异常:Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.
    Spring中的前置增强和后置增强
    Spring中的异常增强
    mybatis中session.getMapper()方法和resultMap
    mybatis中的多对一的查询
    mybatis中的一对多的查询
  • 原文地址:https://www.cnblogs.com/aininot260/p/9448966.html
Copyright © 2020-2023  润新知