首页 > 代码库 > USACO草地排水-网络流dinic模板

USACO草地排水-网络流dinic模板

广搜计算层次图,在层次图上深搜。标准dinic模板。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<vector>
 5 #include<queue>
 6 #include<cmath>
 7 #include<algorithm>
 8 #include<string.h>
 9 #define INF 0x7fffffff
10 using namespace std;
11 struct edge{
12        int to,f,rev;
13 };
14 int ch[210];
15 int N,M,ans;
16 vector <edge> E[210];
17 void add_edge(int s,int e,int c){
18      E[s].push_back((edge){e,c,E[e].size()});
19      E[e].push_back((edge){s,0,E[s].size()-1});
20 }
21 bool bfs()
22 {
23      memset(ch,-1,sizeof(ch));
24      queue <int> que;
25      que.push(1);
26      ch[1]=0;
27      while(que.size()!=0){
28                           int now=que.front();que.pop();
29                           for(int i=0;i<E[now].size();i++){
30                                   if(ch[E[now][i].to]==-1&&E[now][i].f>0){
31                                                            ch[E[now][i].to]=ch[now]+1;
32                                                            que.push(E[now][i].to);
33                                   }
34                           }
35      }
36      if(ch[M]==-1) return false;
37      return true;
38 }
39 int dfs(int now,int maxf)
40 {
41      if(now==M) return maxf;
42      if(maxf==0) return 0;
43      for(int i=0;i<E[now].size();i++){
44              if(ch[E[now][i].to]==ch[now]+1 && E[now][i].f>0){
45                                              int maxn=dfs(E[now][i].to,min(E[now][i].f,maxf));
46                                              if(maxn>0){
47                                                         E[now][i].f-=maxn;
48                                                         E[E[now][i].to][E[now][i].rev].f+=maxn;
49                                                         return maxn;
50                                                         }
51              }
52      }
53      return 0;
54 }
55                                                               
56                                   
57                                                               
58 int main()
59 {
60     int f,s,e,c;
61     scanf("%d%d",&N,&M);
62     for(int i=0;i<N;i++){
63             scanf("%d%d%d",&s,&e,&c);
64             add_edge(s,e,c);
65             
66     }
67     while(bfs()){
68                  while((f=dfs(1,INF))>0){
69                            ans+=f;
70                  }
71     }
72     cout<<ans<<endl;
73     
74     return 0;
75 }

 

USACO草地排水-网络流dinic模板