模板水题一枚。
题意:Farmer建了水渠排水,并且控制了每条水渠的上限。求最大流。
贴个代码意思意思吧。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #include<iostream> 6 using namespace std; 7 #define N 210 8 #define M 210 9 #define INF 0x7ffffff 10 11 struct E{ 12 int v,c,next; 13 }e[N*N<<2]; 14 15 int tol,head[N]; 16 17 void Init() 18 { 19 tol=0; 20 memset(head,-1,sizeof(head)); 21 } 22 23 void Add(int s,int t,int c) 24 { 25 e[tol].v=t; 26 e[tol].c=c; 27 e[tol].next=head[s]; 28 head[s]=tol++; 29 30 e[tol].v=s; 31 e[tol].c=0; 32 e[tol].next=head[t]; 33 head[t]=tol++; 34 } 35 36 int gap[N]; 37 int dis[N]; 38 int pre[N]; 39 int cur[N]; 40 41 int Sap(int s,int t,int n) 42 { 43 int i; 44 for(i=0;i<=n;i++) 45 { 46 dis[i]=gap[i]=0; 47 cur[i]=head[i]; 48 } 49 gap[0]=n; 50 int u=pre[s]=s,maxf=0,aug=INF,v; 51 while(dis[s]<n) 52 { 53 loop: for(i=cur[u];i!=-1;i=e[i].next) 54 { 55 v=e[i].v; 56 if(e[i].c>0&&dis[u]==dis[v]+1){ 57 aug=min(aug,e[i].c); 58 pre[v]=u; 59 cur[u]=i; 60 u=v; 61 if(u==t){ 62 while(u!=s) 63 { 64 u=pre[u]; 65 e[cur[u]].c-=aug; 66 e[cur[u]^1].c+=aug; 67 } 68 maxf+=aug; 69 aug=INF; 70 } 71 goto loop; 72 } 73 } 74 int min=n; 75 for(i=head[u];i!=-1;i=e[i].next) 76 { 77 v=e[i].v; 78 if(e[i].c>0&&dis[v]<min){ 79 min=dis[v]; 80 cur[u]=i; 81 } 82 } 83 if(!(--gap[dis[u]])) 84 break; 85 ++gap[dis[u]=min+1]; 86 u=pre[u]; 87 } 88 return maxf; 89 } 90 int main() 91 { 92 int n,m,i,st,ed; 93 int a,b,c; 94 while(scanf("%d%d",&m,&n)!=EOF) 95 { 96 st=1; 97 ed=n; 98 Init(); 99 for(i=0;i<m;i++) 100 { 101 scanf("%d%d%d",&a,&b,&c); 102 Add(a,b,c); 103 } 104 printf("%d\n",Sap(st,ed,n)); 105 } 106 return 0; 107 }