题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入输出格式 输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)
输出格式:
一行,包含一个正整数,即为该网络的最大流。
最大流模板题。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int oo=0x3f3f3f3f;
int m,n,s,t,fir[10010],ne[200010],to[200010],w[200010],f[10010],que[100010];
int rd()
{
int x=0;
char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}
void add(int num,int u,int v,int x)
{
ne[num]=fir[u];
fir[u]=num;
to[num]=v;
w[num]=x;
}
void init()
{
int i,u,v,x;
n=rd();
m=rd();
s=rd();
t=rd();
for (i=1;i<=m;i++)
{
u=rd();
v=rd();
x=rd();
add(i*2,u,v,x);
add(i*2+1,v,u,0);
}
}
bool find()
{
int hd=1,tl=1,u,v,i;
memset(f,0,sizeof(f));
f[s]=1;
que[1]=s;
while (hd<=tl)
{
u=que[hd++];
for (i=fir[u];i;i=ne[i])
if (w[i]&&!f[v=to[i]])
{
f[v]=f[u]+1;
que[++tl]=v;
}
}
return f[t];
}
int dfs(int u,int lim)
{
if (u==t) return lim;
int i,v,x;
int ret=0;
for (i=fir[u];i&&ret<lim;i=ne[i])
if (w[i]&&f[v=to[i]]==f[u]+1)
{
x=dfs(v,min(lim-ret,w[i]));
w[i]-=x;
w[i^1]+=x;
ret+=x;
}
if (!ret) f[u]=0;
return ret;
}
int main()
{
init();
int x,ans=0;
while (find())
while (x=dfs(s,oo))
ans+=x;
printf("%d\n",ans);
}