洛谷3376 网络最大流

来源:互联网 发布:jdk 7u80 windows x32 编辑:程序博客网 时间:2024/05/22 17:28

题目描述

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入输出格式 输入格式:

第一行包含四个正整数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);}
0 0
原创粉丝点击