[日常摸鱼]最大流

Posted yoooshinow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[日常摸鱼]最大流相关的知识,希望对你有一定的参考价值。

luogu2740[USACO4.2]Drainage Ditches 可以随便求最大流

https://www.luogu.org/problemnew/show/P3376

然后这有个模板题用dinic~

#include<cstdio>
#include<algorithm>
#define rep(i,n) for(register int i=1;i<=n;i++)
using namespace std;
typedef long long lint;
inline lint read()
{
    lint s=0,f=1;char c=getchar();
    while(c<0||c>9){if(c==-)f=0;c=getchar();}
    while(c>=0&&c<=9){s=s*10+c-0;c=getchar();}
    return f?s:-s;;
}
const int N=10005;
const int M=100005;
const lint INF=(~0ull>>1);
struct edge
{
    int to,nxt;lint w;
    edge(int to=0,int nxt=0,lint w=0):to(to),nxt(nxt),w(w){}
}edges[M<<1];
int n,m,cnt,st,ed,s,t;
int head[M<<1],q[N],d[N];
lint ans;
inline void addEdge(int u,int v,lint w)
{
    edges[++cnt]=edge(v,head[u],w);
    head[u]=cnt;
}
#define cur edges[i].to
inline bool bfs()
{
    rep(i,n)d[i]=0;d[s]=1;
    st=ed=0;q[st++]=s;
    while(ed<st)
    {
        int k=q[ed++];
        for(register int i=head[k];i;i=edges[i].nxt)if(!d[cur]&&edges[i].w)
        {
            d[cur]=d[k]+1;q[st++]=cur;
            if(cur==t)return 1;
        }
    }
    return 0;
}
inline lint dinic(int x,lint f)
{
    if(x==t)return f;
    lint res=f;
    for(register int i=head[x];i&&res;i=edges[i].nxt)if(d[cur]==d[x]+1&&edges[i].w)
    {
        int k=dinic(cur,min(edges[i].w,res));
        if(!k)d[cur]=0;
        edges[i].w-=k;edges[i^1].w+=k;res-=k;
    }
    return f-res;
}
#undef cur
int main()
{
    n=read();m=read();s=read();t=read();cnt=1;
    rep(i,m)
    {
        int u,v;lint w;u=read();v=read();w=read();
        addEdge(u,v,w);addEdge(v,u,0);
    }
    lint flow=0;
    while(bfs())while((flow=dinic(s,INF)))ans+=flow;
    printf("%lld",ans);
    return 0;
}

老是忘记cnt=1;orz

以上是关于[日常摸鱼]最大流的主要内容,如果未能解决你的问题,请参考以下文章

[日常摸鱼]loj6000「网络流 24 题」搭配飞行员

[日常摸鱼]「网络流 24 题」试题库

[日常摸鱼]JSOI2008最大数

[日常摸鱼]51nod1237-最大公约数之和V3-杜教筛

[日常摸鱼]bzoj1218[HNOI2003]激光炸弹-二维前缀

前端工程师的摸鱼日常5:年度总结