最大流
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大流相关的知识,希望对你有一定的参考价值。
刚刚学了两个最大流算法Dinic和ISAP,很多地方不是很清楚=_=||
先刷些题练练吧
A - Drainage Ditches
可以说是模板题了
我把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 }
以上是关于最大流的主要内容,如果未能解决你的问题,请参考以下文章