码迷,mamicode.com
首页 > 其他好文 > 详细

Dinic 模板

时间:2016-02-26 23:25:00      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

 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 模板

标签:

原文地址:http://www.cnblogs.com/TenderRun/p/5221902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!