网络流

#include<cstdio>
#include<algorithm>
const int N=205,M=405,INF=0x3f3f3f;
int m,n;
int src,des,lev[N],cur[N];
int ecnt=1,adj[N],nxt[M],go[M],cap[M];
inline void addedge(const int &u,const int &v,const int &w)
{
    nxt[++ecnt]=adj[u],adj[u]=ecnt,go[ecnt]=v,cap[ecnt]=w;
    nxt[++ecnt]=adj[v],adj[v]=ecnt,go[ecnt]=u,cap[ecnt]=0;
}
inline bool bfs()
{
    static int qn,que[N];
    int u,v,e;
    for(int i=src;i<=des;i++) lev[i]=-1,cur[i]=adj[i];
    que[qn=1]=src;lev[src]=0;
    for(int ql=1;ql<=qn;ql++)
    {
        u=que[ql];
        for(e=adj[u];e;e=nxt[e])
        {
            if(cap[e]>0&&lev[v=go[e]]==-1)
            {
                lev[v]=lev[u]+1;
                que[++qn]=v;
                if(v==des) return true;
            }
        }
    }
    return false;
}
inline int dinic(const int &u,const int &flow)
{
    if(u==des) return flow;
    int res=0,v,delta;
    for(int &e=cur[u];e;e=nxt[e])
    {
        if(cap[e]>0&&lev[u]<lev[v=go[e]])
        {
            delta=dinic(v,std::min(cap[e],flow-res));
            if(delta)
            {
                cap[e]-=delta;cap[e^1]+=delta;
                res+=delta;  if(res==flow) break;
            }
        }
    }
    if(res!=flow) lev[u]=-1;
    return res;
}
inline int maxflow()
{
    int ans=0;
    while(bfs()) ans+=dinic(src,INF);
    return ans;
}
int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        ecnt=1;
        for(int i=1;i<=n;i++) adj[i]=0;
        src=1,des=n;
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
        }
        printf("%d
",maxflow());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6295900.html