[日常摸鱼]最大流

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

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

然后这有个模板题用dinic~

#include
#include
#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

转载于:https://www.cnblogs.com/yoooshinow/p/8419478.html

你可能感兴趣的:([日常摸鱼]最大流)