【模板】EK求最大流

来源:互联网 发布:三得利乌龙茶 知乎 编辑:程序博客网 时间:2024/06/13 09:02

求解最大流问题的最简便方法
但是效率不是很理想

参考博客:网络流-最大流

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=505,maxe=40005;int n,e,que[maxn],fa[maxn],id[maxn],ans;bool vis[maxn];struct data{    int son[maxe],nxt[maxe],lnk[maxn],tot;    int flw[maxe],cap[maxe];    void add(int x,int y,int w){        son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;        flw[tot]=0;cap[tot]=w;    }}a;inline int red(){    int tot=0;char ch=getchar();    while (ch<'0'||'9'<ch) ch=getchar();    while ('0'<=ch&&ch<='9') tot=tot*10+ch-48,ch=getchar();    return tot;}bool bfs(){    memset(vis,0,sizeof(vis));    int hed=0,til=1;    que[1]=1;vis[1]=1;    while (hed!=til)     for (int j=a.lnk[que[++hed]];j;j=a.nxt[j])      if (!vis[a.son[j]]&&a.cap[j]>a.flw[j]){        que[++til]=a.son[j];vis[a.son[j]]=1;        fa[a.son[j]]=que[hed];id[a.son[j]]=j;        if (a.son[j]==n) return 1;      }    return 0;}int main(){    n=red(),e=red();a.tot=1;    for (int i=1,x,y,w;i<=e;i++)     x=red(),y=red(),w=red(),a.add(x,y,w),a.add(y,x,0);    while (bfs()){        int Min=0x3f3f3f3f;        for (int x=n;x!=1;x=fa[x])         Min=min(Min,a.cap[id[x]]-a.flw[id[x]]);        ans+=Min;        for (int x=n;x!=1;x=fa[x])         a.flw[id[x]]+=Min,a.flw[id[x]^1]-=Min;    }    printf("%d",ans);    return 0;}
原创粉丝点击