Dinic 模板
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dinic 模板相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 6 using namespace std; 7 const int INF=2147483647; 8 const int maxn=210,maxm=410; 9 int cnt,fir[maxn],nxt[maxm],cap[maxm],to[maxm],dis[maxn]; 10 11 void addedge(int a,int b,int c) 12 { 13 nxt[++cnt]=fir[a]; 14 to[cnt]=b; 15 cap[cnt]=c; 16 fir[a]=cnt; 17 } 18 19 bool BFS(int S,int T) 20 { 21 memset(dis,0,sizeof(dis)); 22 dis[S]=1; 23 queue<int>q;q.push(S); 24 while(!q.empty()) 25 { 26 int node=q.front();q.pop(); 27 for(int i=fir[node];i;i=nxt[i]) 28 { 29 if(!cap[i]||dis[to[i]])continue; 30 dis[to[i]]=dis[node]+1; 31 q.push(to[i]); 32 } 33 } 34 return dis[T]; 35 } 36 37 int DFS(int node,int T,int f) 38 { 39 if(node==T)return f; 40 int d,ret=0; 41 for(int i=fir[node];i;i=nxt[i]) 42 { 43 if(!cap[i]||dis[to[i]]!=dis[node]+1)continue; 44 if(!f)break; 45 d=DFS(to[i],T,min(cap[i],f)); 46 if(d){ 47 ret+=d; 48 cap[i]-=d; 49 cap[i^1]+=d; 50 f-=d; 51 } 52 } 53 return ret; 54 } 55 56 int Dinic(int S,int T) 57 { 58 int ret=0,d; 59 while(BFS(S,T)&&(d=DFS(S,T,INF))) 60 ret+=d; 61 return ret; 62 } 63 64 void Init() 65 { 66 memset(fir,0,sizeof(fir)); 67 cnt=1; 68 } 69 int main() 70 { 71 int n,m; 72 while(~scanf("%d%d",&m,&n)) 73 { 74 Init(); 75 for(int i=1;i<=m;i++){ 76 int x,y,c; 77 scanf("%d%d%d",&x,&y,&c); 78 addedge(x,y,c); 79 addedge(y,x,0); 80 } 81 printf("%d\n",Dinic(1,n)); 82 } 83 84 return 0; 85 }
以上是关于Dinic 模板的主要内容,如果未能解决你的问题,请参考以下文章