AC通道:http://acm.hdu.edu.cn/showproblem.php?pid=1532
Drainage Ditches
Description
在农夫
John
的农场上,每逢下雨,
Bessie
最喜欢的三叶草地就积聚了一潭水。
这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。
因此,农夫
John
修建了一套排水系统来使
Bessie
的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。
作为一名一流的技师,农夫
John
已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。
农夫
John
知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。
需要注意的是,有些时候从一处到另一处不只有一条排水沟。
根据这些信息,计算从水潭排水到小溪的最大流量。
对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
Input
第
1
行: 两个用空格分开的整数
N
是农夫
交点
第
Si
和
Ei
(1≤Si,Ei≤M)
指明排水沟两端的交点,雨水从
Si
流向
Ei
。
Ci(0≤Ci≤10,000,000)
是这条排水沟的最大容量。
Output
输出一个整数,即排水的最大流量。
Sample Input
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
Sample Output
50
Solution
总算开始学网络流了,心情有点激动啊!!
综上,这是一道模板题(但HDU的多组数据坑死我了)。
不多说,上代码。
Code
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- using namespace std;
- const int MAXN=1000;
- int n,m,cnt,s=1,t;
- queue<int>q;
- int weight[MAXN*2],data[MAXN*2];
- int head[MAXN],cur[MAXN],nxt[MAXN*2],dis[MAXN];
- inline int Min(int x,int y){
- return x<y?x:y;
- }
- inline int Max(int x,int y){
- return x>y?x:y;
- }
- void add(int x,int y,int z){
- nxt[cnt]=head[x];data[cnt]=y;weight[cnt]=z;head[x]=cnt++;
- nxt[cnt]=head[y];data[cnt]=x;weight[cnt]=0;head[y]=cnt++;
- }
- bool BFS(){
- memset(dis,-1,sizeof dis);
- dis[1]=0;
- q.push(1);
- while(!q.empty()){
- int now=q.front();
- q.pop();
- for(int i=head[now];i!=-1;i=nxt[i])
- if(weight[i]&&dis[data[i]]<0){
- dis[data[i]]=dis[now]+1;
- q.push(data[i]);
- }
- }
- if(dis[n]==-1)return false;
- return true;
- }
- int dfs(int now,int flow){
- if(now==n)return flow;
- int Low;
- for(int &i=cur[now];i!=-1;i=nxt[i]){
- if(weight[i]&&dis[data[i]]==dis[now]+1){
- Low=dfs(data[i],Min(flow,weight[i]));
- if(Low){
- weight[i]-=Low;
- weight[i^1]+=Low;
- return Low;
- }
- }
- }
- return 0;
- }
- int main(){
- while(scanf(“%d%d”,&m,&n)!=EOF){
- cnt=0;
- for(int i=1;i<=n;i++)head[i]=-1,weight[i]=nxt[i]=0;
- if(n==0){printf(“0\n”);continue;}
- for(int i=1;i<=m;i++){
- int x,y,z;
- scanf(”%d%d%d”,&x,&y,&z);
- add(x,y,z);
- }
- int sum=0,flow;
- while(BFS()){
- memcpy(cur,head,sizeof head);
- while(flow=dfs(1,0x3f3f3f3f))sum+=flow;
- }
- printf(”%d\n”,sum);
- }
- return 0;
- }