最小费用最大流模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define MAXN 1000010
using namespace std;
inline void read(int &x)
{
    int s=0,w=1;
    char c=getchar();
    while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}
    while(isdigit(c)){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
    x=s*w;
}
inline void write(int x)
{
    if(x<0)x=-x,putchar('-');
    if(x>9)write(x/10);
    putchar('0'+x%10);
}
struct edge
{
    int to,nxxt,cost,flow;
}e[MAXN];
int head[MAXN],cnt=-1;
inline void add(int x,int y,int f,int c)
{
    e[++cnt].to=y;
    e[cnt].cost=c;
    e[cnt].flow=f;
    e[cnt].nxxt=head[x];
    head[x]=cnt;
}
int pre[MAXN],last[MAXN],flow[MAXN],maxflow,mincost,cost[MAXN],S,T;
bool vis[MAXN];
int Q[MAXN<<2],front=1,rear=0;
inline bool spfa(int s,int t)
{
    memset(cost,0x3f,sizeof(cost));
    memset(flow,0x3f,sizeof(flow));
    memset(vis,0,sizeof(vis));
    front=1,rear=0;
    Q[++rear]=s;
    vis[s]=true,cost[s]=0,pre[t]=-1;
    while(front<=rear)
    {
        int to=Q[front++];
        vis[to]=false;
        for(int i=head[to];i!=-1;i=e[i].nxxt)
        {
            if(e[i].flow>0&&cost[e[i].to]>cost[to]+e[i].cost)
            {
                cost[e[i].to]=cost[to]+e[i].cost;
                pre[e[i].to]=to;
                last[e[i].to]=i;
                flow[e[i].to]=min(flow[to],e[i].flow);
                if(!vis[e[i].to])
                Q[++rear]=e[i].to,vis[e[i].to]=true;
            }
        }
    }
    return pre[t]^(-1);
}
inline void MCMF()
{
    while(spfa(S,T))
    {
        int now=T;
        maxflow+=flow[now],mincost+=cost[now]*flow[now];
        while(now^S)
        {
            e[last[now]].flow-=flow[T];
            e[last[now]^1].flow+=flow[T];
            now=pre[now];
        }
    }
}
int n,m;
int main()
{
    memset(head,-1,sizeof(head));
    read(n),read(m),read(S),read(T);
    while(m--)
    {
        int u,v,w,f;
        read(u),read(v),read(w),read(f);
        add(u,v,w,f),add(v,u,0,-f);
    }
    MCMF();
    write(maxflow),putchar(' '),write(mincost),putchar(10);
}

猜你喜欢

转载自blog.csdn.net/assass_cannotin/article/details/79386981