【模板】网络流Dicnic

版权声明:本文为博主原创文章。 https://blog.csdn.net/qq_37657307/article/details/86689657

模板题

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
struct mzls
{
    int to,cap,rev;
    mzls(){}
    mzls(int a,int b,int c)
    {
        to=a,cap=b,rev=c;
    }
};
vector<mzls>g[10005];
int n,m,s,t;
int lev[10005],iter[10005];
inline void bfs(int s)
{
    memset(lev,-1,sizeof(lev));
    queue<int>que;
    lev[s]=0;
    que.push(s);
    while(!que.empty())
    {
        int x=que.front();
        que.pop();
        int l1=g[x].size();
        for(int i=0;i<l1;i++)
        {
            mzls &ml=g[x][i];
            if(ml.cap>0&&lev[ml.to]<0)
            {
                lev[ml.to]=lev[x]+1;
                que.push(ml.to);
            }
        }
    }
}
inline int dfs(int x,int ml)
{
    if(x==t)
        return ml;
    int l1=g[x].size();
    for(int &i=iter[x];i<l1;i++)
    {
        mzls &as=g[x][i];
        if(as.cap<=0||lev[as.to]<=lev[x])
            continue;
        int x1=dfs(as.to,min(ml,as.cap));
        if(x1>0)
        {
            as.cap-=x1;
            g[as.to][as.rev].cap+=x1;
            return x1;
        }
    }
    return 0;
}
inline int max_flow(int s,int t)
{
    int ret=0;
    for(;;)
    {
        bfs(s);
        if(lev[t]<0)
            return ret;
        memset(iter,0,sizeof(iter));
        int x1;
        while((x1=dfs(s,INF))>0)
            ret+=x1;
    }
}
int main()
{
    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);
        g[x].push_back(mzls(y,z,g[y].size()));
        g[y].push_back(mzls(x,0,g[x].size()-1));
    }
    printf("%d",max_flow(s,t));
}

猜你喜欢

转载自blog.csdn.net/qq_37657307/article/details/86689657
今日推荐