最大流

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大流相关的知识,希望对你有一定的参考价值。

 

刚刚学了两个最大流算法Dinic和ISAP,很多地方不是很清楚=_=||

先刷些题练练吧

A - Drainage Ditches

 HDU - 1532

可以说是模板题了

我把Lrj的模板改了下,个人不太喜欢用vector==

技术分享
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define CLR(m,a) memset(m,a,sizeof(m))
  4 const int inf=0x3f3f3f3f;
  5 const int maxv=210;
  6 int n,m;
  7 struct Edge
  8 {
  9     int u,v,cap,flow;
 10     int nex;
 11 }e[maxv<<1];
 12 int head[maxv];
 13 int cnt=0;
 14 void init()
 15 {
 16     CLR(head,-1);
 17     cnt=0;
 18 }
 19 void add(int u,int v,int cap)
 20 {
 21     e[cnt].u=u;
 22     e[cnt].v=v;
 23     e[cnt].cap=cap;
 24     e[cnt].flow=0;
 25     e[cnt].nex=head[u];
 26     head[u]=cnt++;
 27 }
 28 
 29 int vis[maxv],d[maxv],cur[maxv];
 30 int s,t;
 31 int bfs()
 32 {
 33     CLR(vis,0);
 34     queue<int> q;
 35     q.push(s);
 36     d[s]=0;
 37     vis[s]=1;
 38     while(!q.empty())
 39     {
 40         int u=q.front();
 41         q.pop();
 42         for(int i=head[u];~i;i=e[i].nex)
 43         {
 44             int v=e[i].v;
 45             if(!vis[v]&&e[i].cap>e[i].flow)
 46             {
 47                 vis[v]=1;
 48                 d[v]=d[u]+1;
 49                 q.push(v);
 50             }
 51         }
 52     }
 53     return vis[t];
 54 }
 55 
 56 int dfs(int x,int a)
 57 {
 58     if(x==t||a==0) return a;
 59     int flow=0,f;
 60     for(int &i=cur[x];~i;i=e[i].nex)
 61     {
 62         int v=e[i].v;
 63         if(d[x]+1==d[v]&&(f=dfs(v,min(a,e[i].cap-e[i].flow)))>0)
 64         {
 65             e[i].flow+=f;
 66             e[i^1].flow-=f;
 67             flow+=f;
 68             a-=f;
 69             if(a==0) break;
 70         }
 71     }
 72     return flow;
 73 }
 74 
 75 int Maxflow()
 76 {
 77     int flow=0;
 78     while(bfs())
 79     {
 80         for(int i=0;i<n;i++) cur[i]=head[i];
 81         flow+=dfs(s,inf);
 82     }
 83     return flow;
 84 }
 85 
 86 int main()
 87 {
 88     while(scanf("%d%d",&m,&n)!=EOF)
 89     {
 90         init();
 91         int u,v,cap;
 92         for(int i=0;i<m;i++)
 93         {
 94             scanf("%d%d%d",&u,&v,&cap);
 95             u--;v--;
 96             add(u,v,cap);
 97             add(v,u,0);
 98         }
 99         s=0;t=n-1;  //
100         printf("%d\n",Maxflow());
101     }
102 }
View Code

 

以上是关于最大流的主要内容,如果未能解决你的问题,请参考以下文章

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流

费用流伪代码

是否可以动态编译和执行 C# 代码片段?

从流输入中解析没有根元素的 XML 片段列表

16个必备的JavaScript代码片段

[洛谷P3381]模板最小费用最大流