P3381 【模板】最小费用最大流
创始人
2024-03-17 10:25:55
0

hello everyone,大家好,我是love——putter,好久没发题解了(因为没素材了)所以,今天来发一下P3381 【模板】最小费用最大流的题解

题目描述

给出一个包含 nn 个点和 mm 条边的有向图(下面称其为网络) G=(V,E)G=(V,E),该网络上所有点分别编号为 1 \sim n1∼n,所有边分别编号为 1\sim m1∼m,其中该网络的源点为 ss,汇点为 tt,网络上的每条边 (u,v)(u,v) 都有一个流量限制 w(u,v)w(u,v) 和单位流量的费用 c(u,v)c(u,v)。

你需要给每条边 (u,v)(u,v) 确定一个流量 f(u,v)f(u,v),要求:

  1. 0 \leq f(u,v) \leq w(u,v)0≤f(u,v)≤w(u,v)(每条边的流量不超过其流量限制);
  2. \forall p \in \{V \setminus \{s,t\}\}∀p∈{V∖{s,t}},\sum_{(i,p) \in E}f(i,p)=\sum_{(p,i)\in E}f(p,i)∑(i,p)∈E​f(i,p)=∑(p,i)∈E​f(p,i)(除了源点和汇点外,其他各点流入的流量和流出的流量相等);
  3. \sum_{(s,i)\in E}f(s,i)=\sum_{(i,t)\in E}f(i,t)∑(s,i)∈E​f(s,i)=∑(i,t)∈E​f(i,t)(源点流出的流量等于汇点流入的流量)。

定义网络 GG 的流量 F(G)=\sum_{(s,i)\in E}f(s,i)F(G)=∑(s,i)∈E​f(s,i),网络 GG 的费用 C(G)=\sum_{(i,j)\in E} f(i,j) \times c(i,j)C(G)=∑(i,j)∈E​f(i,j)×c(i,j)。

你需要求出该网络的最小费用最大流,即在 F(G)F(G) 最大的前提下,使 C(G)C(G) 最小。

输入格式

输入第一行包含四个整数 n,m,s,tn,m,s,t,分别代表该网络的点数 nn,网络的边数 mm,源点编号 ss,汇点编号 tt。

接下来 mm 行,每行四个整数 u_i,v_i,w_i,c_iui​,vi​,wi​,ci​,分别代表第 ii 条边的起点,终点,流量限制,单位流量费用。

输出格式

输出两个整数,分别为该网络的最大流 F(G)F(G),以及在 F(G)F(G) 最大的前提下,该网络的最小费用 C(G)C(G)。

输入输出样例

输入 #1复制

4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5

输出 #1复制

50 280

说明/提示

对于 100\%100% 的数据,1 \leq n \leq 5\times 10^31≤n≤5×103,1 \leq m \leq 5 \times 10^41≤m≤5×104,1 \leq s,t \leq n1≤s,t≤n,u_i \neq v_iui​=vi​,0 \leq w_i,c_i \leq 10^30≤wi​,ci​≤103,且该网络的最大流和最小费用 \leq 2^{31}-1≤231−1。

输入数据随机生成。

代码,(答案仅能得54分 求大佬帮忙。)

#include
#define ll long long
using namespace std;

const int N=5e3+5;
const int M=5e4+5;

struct edge {
    int v;
    int r;
    int c;
    int next;
} es[M<<1];

int n,m,s,t,cnt=1;
int head[N];
queue q;
int cost[N],dis[N],pre[N];
bool vis[N];
ll maxflow,mincost;

void addedge(int u,int v,int w,int c)
{
    cnt++;
    es[cnt].v=v;
    es[cnt].r=w;
    es[cnt].c=c;
    es[cnt].next=head[u];
    head[u]=cnt;
}

bool SPFA()
{
    memset(cost,0x7f,sizeof(cost));
    memset(dis,0x7f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    cost[s]=0;
    q.push(s);
    vis[s]=true;
    while (!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=false;
        for (int i=head[u];i>0;i=es[i].next)
        {
            edge e=es[i];
            if (e.r>0 && cost[u]+e.c             {
                cost[e.v]=cost[u]+e.c;
                pre[e.v]=i;
                dis[e.v]=min(dis[u],e.r);
                if (!vis[e.v])
                {
                    q.push(e.v);
                    vis[e.v]=true;
                }
            }
        }
    }
}

void minCostMaxFlow()
{
    while (SPFA())
    {
        int now=t;
        maxflow+=dis[t];
        mincost+=dis[t]*cost[t];
        while (now!=s)
        {
            int loc=pre[now];
            es[loc].r-=dis[t];
            es[loc^1].r+=dis[t];
            now=es[loc^1].v;
        }
    }
}

int main()
{
    int u,v,w,c;
    cin>>n>>m>>s>>t;
    for (int i=1;i<=m;i++)
    {
        cin>>u>>v>>w>>c;
        addedge(u,v,w,c);
        addedge(v,u,0,-c);
    }
    minCostMaxFlow();
    cout<     return 0;
}

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...