hdu1532 Drainage Ditches(最大流)
Posted scott527407973
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1532 Drainage Ditches(最大流)相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=1532
代码来自https://blog.csdn.net/qq_31759205/article/details/52947859
直接套最大流模板
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=205; 5 const int maxe=4*maxn*maxn; 6 struct MaxFlow 7 { 8 struct Edge 9 { 10 int next,to,w; 11 }edge[maxe]; 12 int head[maxn],tot,level[maxn]; 13 void init() 14 { 15 memset(head,-1,sizeof(head)); 16 tot=0; 17 } 18 void add(int u,int v,int w) 19 { 20 edge[tot].to=v; 21 edge[tot].w=w; 22 edge[tot].next=head[u]; 23 head[u]=tot++; 24 25 edge[tot].to=u; 26 edge[tot].w=0; 27 edge[tot].next=head[v]; 28 head[v]=tot++; 29 } 30 bool bfs(int s,int t) 31 { 32 memset(level,-1,sizeof(level)); 33 queue<int>q; 34 q.push(s); 35 level[s]=0; 36 while(!q.empty()) 37 { 38 int u=q.front();q.pop(); 39 for(int i=head[u];~i;i=edge[i].next) 40 { 41 int v=edge[i].to; 42 if(edge[i].w>0&&level[v]<0) 43 { 44 level[v]=level[u]+1; 45 q.push(v); 46 } 47 } 48 } 49 return level[t]>0; 50 } 51 int dfs(int u,int t,int f) 52 { 53 if(u==t) return f; 54 for(int i=head[u];~i;i=edge[i].next) 55 { 56 int v=edge[i].to; 57 if(edge[i].w>0&&level[v]>level[u]) 58 { 59 int d=dfs(v,t,min(f,edge[i].w)); 60 if(d>0) 61 { 62 edge[i].w-=d; 63 edge[i^1].w+=d; 64 return d; 65 } 66 } 67 } 68 level[u]=-1; 69 return 0; 70 } 71 int slove(int s,int t) 72 { 73 int flow=0,f; 74 while(bfs(s,t)) 75 { 76 while(f=dfs(s,t,inf)) flow+=f; 77 } 78 return flow; 79 } 80 }F; 81 int main() 82 { 83 int n,m; 84 while(~scanf("%d%d",&m,&n)) 85 { 86 F.init(); 87 for(int i=0;i<m;i++) 88 { 89 int u,v,c; 90 scanf("%d%d%d",&u,&v,&c); 91 F.add(u,v,c); 92 } 93 printf("%d ",F.slove(1,n)); 94 } 95 return 0; 96 }
以上是关于hdu1532 Drainage Ditches(最大流)的主要内容,如果未能解决你的问题,请参考以下文章