題意:某農民有莊稼地,每到下雨就被淹,變成了池塘,於是農民就修建了水渠將水從莊稼地中導出,水渠有幾個中轉站(也可能沒有),莊稼地的水最後流到小溪。題目告訴你,莊稼地、中轉站、小溪之間的水渠連接狀況(兩點之間會有多條邊),以及各段水渠的最大水流速度。問,莊稼地裏的水的最大導出速度是多少?
很明顯,這是一道網絡流中的最大流問題,我用的是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;
}
}