网络流模板

ISAP:

#include<bits/stdc++.h>
using namespace std;
namespace IO{
    const int mod=998244353;
    #define ll long long
    #define db double
    #define FLS fflush(stdout)
    #define FOR(i,a,b) for(int i=a;i<=b;++i)
    #define ROF(i,a,b) for(int i=a;i>=b;--i)
    inline int max(int a,int b) {return (a>b)?a:b;}
    inline int min(int a,int b) {return (a<b)?a:b;}
    inline int MOD(ll a) {return (a<mod)?a:a-a/mod*mod;}
    inline int inc(int a,int b) {return (a+=b)>=mod?a-mod:a;}
    inline int dec(int a,int b) {return (a-=b)<0?a+mod:a;}
    inline ll ksm(ll a,int b) {ll res=1;while(b) {if(b&1) res=MOD(res*a);a=MOD(a*a);b>>=1;}return res;}
    char buf[1<<21],*p1=buf,*p2=buf;
    #define Fin(a) freopen(a".in","r",stdin)
    #define Fout(a) freopen(a".out","w",stdout)
    inline int getchar(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    inline int read(){
        int ret=0;bool f=0;char ch=getchar();
        while(ch<'0' || ch>'9') {if(ch=='-') f=1;ch=getchar();}
        while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-48;ch=getchar();}
        return f?-ret:ret;
    }
}using namespace IO;

const int N=210,M=5010,inf=1e9;
int n,m,s,t,head[N],cnt=1,cur[N],dep[N],gap[N];
struct edge{int v,w,nxt;}e[M<<1];
inline void add(int u,int v,int w) {e[++cnt]=edge{v,w,head[u]};head[u]=cnt;} 
inline void note_h() {
    memset(dep,-1,sizeof(dep));
    queue<int> q;dep[t]=0;++gap[0];q.push(t);
    while(q.size()){
        int u=q.front();q.pop();
        for(int i=head[u];i;i=e[i].nxt) {
            int v=e[i].v;
            if(dep[v]!=-1) continue;
            dep[v]=dep[u]+1;
            ++gap[dep[v]];
            q.push(v);
        }
    }
}

ll maxflow=0;
int dfs(int u,int flow) {
    if(u==t) {
        maxflow+=flow;
        return flow;
    }
    int res=0;
    for(int i=cur[u];i;i=e[i].nxt) {
        int v=e[i].v;cur[u]=i;
        if(dep[v]+1==dep[u] && e[i].w) {
            int Mi=dfs(v,min(e[i].w,flow-res));
            e[i].w-=Mi;
            e[i^1].w+=Mi;
            res+=Mi;
        }
        if(res==flow) return flow;
    }
    if(!--gap[dep[u]]) dep[s]=n+1;
    ++gap[++dep[u]];
    return res;
}

inline ll ISAP() {
    note_h();
    while(dep[s]<n) memcpy(cur,head,sizeof(head)),dfs(s,inf);
    return maxflow;
}

signed main(){
#ifdef LOCAL
    Fin("P3376_1");Fout("1");
#endif
    n=read();m=read();s=read();t=read();
    FOR(i,1,m) {
        int u=read(),v=read(),w=read();
        add(u,v,w);add(v,u,0);
    }printf("%lld\n",ISAP());
#ifdef LOCAL        
    fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
    return 0;
}

费用流(MCMF)

#include<bits/stdc++.h>
using namespace std;
namespace IO{
    const int mod=998244353;
    #define ll long long
    #define db double
    #define FLS fflush(stdout)
    #define FOR(i,a,b) for(int i=a;i<=b;++i)
    #define ROF(i,a,b) for(int i=a;i>=b;--i)
    inline int max(int a,int b) {return (a>b)?a:b;}
    inline int min(int a,int b) {return (a<b)?a:b;}
    inline int MOD(ll a) {return (a<mod)?a:a-a/mod*mod;}
    inline int inc(int a,int b) {return (a+=b)>=mod?a-mod:a;}
    inline int dec(int a,int b) {return (a-=b)<0?a+mod:a;}
    inline ll ksm(ll a,int b) {ll res=1;while(b) {if(b&1) res=MOD(res*a);a=MOD(a*a);b>>=1;}return res;}
    char buf[1<<21],*p1=buf,*p2=buf;
    #define Fin(a) freopen(a".in","r",stdin)
    #define Fout(a) freopen(a".out","w",stdout)
    inline int getchar(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    inline int read(){
        int ret=0;bool f=0;char ch=getchar();
        while(ch<'0' || ch>'9') {if(ch=='-') f=1;ch=getchar();}
        while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-48;ch=getchar();}
        return f?-ret:ret;
    }
}using namespace IO;

const int N=5e3+10,M=5e4+10,inf=1e9;
int n,m,s,t,head[N],cnt=1;
struct edge{int v,w,dis,nxt;}e[M<<1];
inline void add(int u,int v,int w,int dis) {
    e[++cnt]=edge{v,w,dis,head[u]};head[u]=cnt;
}
int maxflow,mincost;

int dis[N],W[N],vis[N],pre[N];
inline int spfa() {
    memset(dis,0x3f,sizeof(dis));
    queue<int> q;q.push(s);dis[s]=0;W[s]=inf;
    while(q.size()) {
        int u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=e[i].nxt) {
            int v=e[i].v;
            if(!e[i].w) continue ;
            if(dis[v]>dis[u]+e[i].dis) {
                dis[v]=dis[u]+e[i].dis;
                W[v]=min(W[u],e[i].w);
                pre[v]=i;
                if(!vis[v]) q.push(v),vis[v]=1;
            }
        }
    }
    if(dis[t]==dis[n+1]) return 0;
    return 1;
}

inline void MCMF() {
    while(spfa()) {
        maxflow+=W[t];
        mincost+=W[t]*dis[t];
        int x=t,i;
        while(x!=s) {
            i=pre[x];
            e[i].w-=W[t];
            e[i^1].w+=W[t];
            x=e[i^1].v;
        }
    }
}

signed main(){
#ifdef LOCAL
    Fin("1");Fout("1");
#endif
    n=read();m=read();s=read();t=read();
    FOR(i,1,m) {
        int u=read(),v=read(),w=read(),dis=read();
        add(u,v,w,dis);
        add(v,u,0,-dis);
    }
    MCMF();
    cout<<maxflow<<' '<<mincost<<endl;
#ifdef LOCAL        
    fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
    return 0;
}

posted @   Kzos_017  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示