首页 > 其他 > 详细

【最大流Dinic模板】HDU1532&POJ1273-Drainage Ditches

时间:2016-01-23 18:14:49      阅读:197      评论:0      收藏:0      [点我收藏+]
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 struct node
10 {
11        int to,pos,cap;
12 };
13 const int MAXN=1100;
14 const int INF=0x7fffffff;
15 vector<node> E[MAXN]; 
16 int m,n;//m:edges n:points
17 int d[MAXN];
18 int vis[MAXN];
19 
20 void addedge(int u,int v,int w)
21 {
22      E[u].push_back((node){v,E[v].size(),w});
23      E[v].push_back((node){u,E[u].size()-1,0});
24 }
25 
26 int bfs()//从源点开始进行分层 
27 {
28      memset(d,-1,sizeof(d)); 
29      d[1]=0;
30      queue<int> que;
31      que.push(1);
32      while (!que.empty())
33      {
34            int head=que.front();que.pop();
35            for (int i=0;i<E[head].size();i++)
36            {
37                node tmp=E[head][i];
38                if (d[tmp.to]>=0|| tmp.cap<=0) continue;
39                d[tmp.to]=d[head]+1;
40                que.push(tmp.to);
41            }
42      }
43      if (d[n]>0) return 1;
44         else return 0;
45 }
46 
47 int dfs(int s,int t,int f)
48 {
49      if (s==t) return f;
50      vis[s]=1;
51      for (int i=0;i<E[s].size();i++)
52      {
53          node &tmp=E[s][i];
54          if (vis[tmp.to]==0 && tmp.cap>0 && d[tmp.to]==d[s]+1)
55          {
56             int delta=dfs(tmp.to,t,min(f,tmp.cap));
57             if (delta>0)
58             {
59                tmp.cap-=delta;
60                E[tmp.to][tmp.pos].cap+=delta;
61                return delta;
62             }
63          }
64      }
65      return 0;
66 }
67 
68 int main()
69 {
70     while (~scanf("%d%d",&m,&n))
71     {
72           memset(E,0,sizeof(E));
73           for (int i=0;i<m;i++)
74           {
75               int u,v,w;
76               scanf("%d%d%d",&u,&v,&w);
77               addedge(u,v,w);
78           }
79           
80           int flow=0;
81           while (bfs())
82           {
83                 for (;;)
84                 {
85                     memset(vis,0,sizeof(vis));
86                     int f=dfs(1,n,INF);
87                     if (f==0) break;
88                         else flow+=f;
89                 }
90           }
91           cout<<flow<<endl;
92     }
93     return 0;
94 }

 

【最大流Dinic模板】HDU1532&POJ1273-Drainage Ditches

原文:http://www.cnblogs.com/iiyiyi/p/5153504.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!