题意:某农民有庄稼地,每到下雨就被淹,变成了池塘,于是农民就修建了水渠将水从庄稼地中导出,水渠有几个中转站(也可能没有),庄稼地的水最后流到小溪。题目告诉你,庄稼地、中转站、小溪之间的水渠连接状况(两点之间会有多条边),以及各段水渠的最大水流速度。问,庄稼地里的水的最大导出速度是多少?
很明显,这是一道网络流中的最大流问题,我用的是Ford-Fulkerson解决的。
代码如下:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
int const maxm=205;
const long long INF=1e+18;
typedef struct
{
int to;
long long flow;
int biaohao;
}edge;
vector<edge>node[maxm];
bool used[maxm];
void init(int m)//一定要注意初始化,我在这里WA了三次
{
for(int i=1;i<=m;i++)
node[i].clear();
}
void add_edge(int a,int b,long long c)
{
edge ed;
ed.to=b;
ed.flow=c;
ed.biaohao=node[b].size();
node[a].push_back(ed);
ed.to=a;
ed.flow=0;
ed.biaohao=node[a].size()-1;
node[b].push_back(ed);
}
long long dfs(int v,int e,long long f)
{
if(v==e) return f;
used[v]=1;
for(int i=0;i<node[v].size();i++)
{
int u=node[v][i].to;
long long f1=node[v][i].flow;
if(!used[u]&&f1!=0)
{
long long f2=dfs(u,e,min(f1,f));
if(f2>0)
{
node[v][i].flow-=f2;
node[u][node[v][i].biaohao].flow+=f2;
return f2;
}
}
}
return 0;
}
long long max_flow(int s,int e)
{
long long ff=0;
for(;;)
{
memset(used,0,sizeof(used));
long long f=dfs(s,e,INF);
if(f==0)return ff;
ff+=f;
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int a,b;
long long c;
init(m);
for(int i=0;i<n;i++)
{
cin>>a>>b>>c;
add_edge(a,b,c);
}
cout<<max_flow(1,m)<<endl;
}
}