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

 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)