http://poj.org/problem?id=1273
题目大意:
- 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。 根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
- 输入描述 第1行: 两个用空格分开的整数N (0 <= N <= 200) 和 M (2 <= M <= 200)。N是农夫John已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。 第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。
- 输出描述 输出一个整数,即排水的最大流量。
第一道网络流,两种方法:
- 用 Edmonds_Karp
参考: http://blog.csdn.net/huzhengnan/article/details/7766446
http://blog.csdn.net/smartxxyx/article/details/9293665/ (非常好)
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
#define inf 0x7f7f7f7f
int m,n;
int s,t;
int sum;
int c[202][202];
int f[202][202];
int fa[202];
int a[202];
int min(int x,int y){return x<y?x:y;}
void Edmonds_Karp()
{
int i,u,v;
queue <int> q;
while(1)
{
memset(a,0,sizeof(a));
a[s]=inf;
q.push(s);
while(!q.empty())
{
u=q.front();
q.pop();
for(v=1;v<=m;v++)
{
if(!a[v]&&f[u][v]<c[u][v])
{
fa[v]=u;
q.push(v);
a[v]=min(a[u],c[u][v]-f[u][v]);
}
}
}
if(a[t]==0)
{
break;
}
else
{
sum+=a[t];
for(i=t;i!=s;i=fa[i])
{
f[fa[i]][i]+=a[m];
f[i][fa[i]]-=a[m];
}
}
}
printf("%d\n",sum);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
s=1;
t=m;
sum=0;
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
int i,j;
for(i=1;i<=n;i++)
{
int x,y,val;
scanf("%d%d%d",&x,&y,&val);
c[x][y]+=val;
}
Edmonds_Karp();
}
return 0;
}
- 用 Dinic
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
#define inf 0x3f3f3f3f
int m,n;
int s,t;
int head[402],to[402],next[402],val[402],cnt;
void add(int x,int y,int z){to[cnt]=y;val[cnt]=z;next[cnt]=head[x];head[x]=cnt++;}
int d[202];
int min(int x,int y){return x<y?x:y;}
queue<int> q;
bool bfs()
{
memset(d,0,sizeof(d));
while(!q.empty()) q.pop();
d[s]=1; q.push(s);
while(!q.empty())
{
int x=q.front(),y; q.pop();
for(int i=head[x];i!=-1;i=next[i])
{
if(val[i]&&!d[y=to[i]])
{
d[y]=d[x]+1;
q.push(y);
}
}
}
if(d[t]>0) return true;
else return false;
}
int dfs(int x,int f)
{
if(x==t) return f;
int temp=f,y;
for(int i=head[x];i!=-1;i=next[i])
{
if(val[i]&&d[y=to[i]]==d[x]+1)
{
int k=dfs(y,min(temp,val[i]));
if(!k) d[y]=0;
val[i]-=k; val[i^1]+=k;
if(!(temp-=k)) break;
}
}
return f-temp;
}
int Dinic()
{
int re=0;
while(bfs())
{
while(int kk=dfs(s,inf)) re+=kk;
}
return re;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
s=1;
t=m;
cnt=0;
memset(to,0,sizeof(to));
memset(val,0,sizeof(val));
memset(next,-1,sizeof(next));
memset(head,-1,sizeof(head));
int i,j;
for(i=1;i<=n;i++)
{
int x,y,g;
scanf("%d%d%d",&x,&y,&g);
int if_had=0;
for(int j=head[x];j;j=next[j])
{
if(to[j]==y)
{
val[j]+=g;
if_had=1;
}
}
if(!if_had)
{
add(x,y,g);
add(y,x,0);
}
}
printf("%d\n",Dinic());
}
return 0;
}