首页 > 代码库 > [USACO4.2]Drainage Ditches

[USACO4.2]Drainage Ditches

练习网络流的好题目,这里给出的是Dinic

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=250;
 4 int n,m;
 5 struct Dinic{
 6     int G[N][N],dis[N];
 7     void build(){
 8         memset(G,0,sizeof G);
 9         for(int i=1;i<=m;++i){
10             int u,v,f;
11             scanf("%d%d%d",&u,&v,&f);
12             G[u][v]+=f;
13         }
14     }
15     bool BFS(){
16         queue<int> Q;
17         memset(dis,-1,sizeof dis);
18         dis[1]=0;
19         Q.push(1);
20         while(!Q.empty()){
21             int u=Q.front();Q.pop();
22             if(u==n)return 1;
23             for(int i=1;i<=n;++i){
24                 if(~dis[i]||G[u][i]<=0)continue;
25                 dis[i]=dis[u]+1;
26                 Q.push(i);
27             }
28         }
29         return 0;
30     }
31     int dfs(int u,int low){
32         int a=0;
33         if(u==n)return low;
34         for(int i=1;i<=n;++i)
35             if(G[u][i]>0&&dis[i]==dis[u]+1){
36                 a=dfs(i,min(low,G[u][i]));
37                 G[u][i]-=a;
38                 G[i][u]+=a;
39                 if(a)return a;
40             }
41         return 0;
42     }
43     int dinic(){
44         int ans=0,t;
45         while(BFS())
46             while(t=dfs(1,0x3f3f3f3f))ans+=t;
47         return ans;
48     }
49 }D;
50 int main(){
51     while(~scanf("%d%d",&m,&n)){
52         D.build();
53         printf("%d\n",D.dinic());
54     }
55     return 0;
56 }

 

[USACO4.2]Drainage Ditches