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 模板的主要内容,如果未能解决你的问题,请参考以下文章

模板——Dinic

P3376 网络流-最大流模板题(Dinic+当前弧优化)

模板之dinic

dinic算法模板

模板dinic算法

模板dinic算法网络最大流