最大流dinic板子

题目: https://www.luogu.com.cn/problem/P3376

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int INF=0x7fffffff;
typedef long long ll;
int n,m,s,t;
int head[MAXN<<1],tot;
struct node
{
    int to,nxt,flow;
}e[MAXN<<1];
void add(int x,int y,int z)
{
    e[tot].to=y;e[tot].nxt=head[x];e[tot].flow=z;head[x]=tot++;
}
void add_edge(int x,int y,int z)
{
    add(x,y,z);add(y,x,0);
}
ll deep[MAXN],tail,be,q[MAXN];
bool bfs()
{
    memset(deep,0,sizeof(deep));
    deep[s]=1;
    ll be=0,tail=1;
    q[1]=s;
    while(be!=tail)
    {
        ll u=q[++be];
        for(int i=head[u];~i;i=e[i].nxt)
        {
            if(!deep[e[i].to]&&e[i].flow)
            {
                deep[e[i].to]=deep[u]+1;
                q[++tail]=e[i].to;
            }
        }
    }
    return deep[t];
}
int dfs(int now,int fa1)
{
    if(now==t)return fa1;
    int fa=0;
    for(int i=head[now];~i&&fa1;i=e[i].nxt)
    {
        if(deep[e[i].to]==deep[now]+1&&e[i].flow)
        {
            int d=dfs(e[i].to,min(fa1,e[i].flow));
            if(d>0)
            {
                e[i].flow-=d;
                e[i^1].flow+=d;
                fa1-=d;
                fa+=d;
            }
        }
    }
    if(!fa)deep[now]=-1;
    return fa;
}
ll dinic()
{
    ll res=0;
    while(bfs())
    {
        res+=dfs(s,INF);
    }
    return res;
}
int main()
{
    memset(head,-1,sizeof(head));
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;scanf("%d%d%d",&x,&y,&z);
        add_edge(x,y,z);
    }
    int ans=dinic();
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2020-02-24 14:49  grass_lin  阅读(141)  评论(0编辑  收藏  举报