P3381 【模板】最小费用最大流(MCMF)
P3381 【模板】最小费用最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。
输入格式 第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。
输出格式 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用。
输入输出样例
输入 #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
说明/提示 时空限制:1000ms,128M
(BYX:最后两个点改成了1200ms)
数据规模:
对于30%的数据:N<=10,M<=10
对于70%的数据:N<=1000,M<=1000
对于100%的数据:N<=5000,M<=50000
样例说明:
如图,最优方案如下:
第一条流为4–>3,流量为20,费用为3*20=60。
第二条流为4–>2–>3,流量为20,费用为(2+1)*20=60。
第三条流为4–>2–>1–>3,流量为10,费用为(2+9+5)*10=160。
故最大流量为50,在此状况下最小费用为60+60+160=280。
故输出50 280。
思路
Spfa + Dinic
题解如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
const int maxn = 5005;
const int maxm = 150000;
int n, m, s, e;
struct Edge
{
    int v, w, cap, next;
} edge[maxm];
int head[maxn], dis[maxn], use[maxn];
int pre[maxn], last[maxm];      //pre 是用来存储上一个节点的, 而last 则是存储上一个边
int flow[maxn];
int k = -1;
ll mx_flw = 0, mn_cst = 0;
void Add(int u, int v, int w, int cap)
{
    edge[++ k] = (Edge){ v, w, cap, head[u]}; head[u] = k;
    edge[++ k] = (Edge){ u, -w, 0, head[v]};  head[v] = k;
}
bool Spfa(int s, int e)
{
    int ar[10];
    for(int i = 0; i <= n; i ++)
        dis[i] = INF, use[i] = 0, flow[i] = INF;
    dis[s] = 0;
    queue<int> q;
    q.push(s);
    int u,v,w;
    while(! q.empty())
    {
        u = q.front(); q.pop();
        use[u] = 0;
        for(int i = head[u]; i != -1; i = edge[i].next)
        {
            v = edge[i].v;
            w = edge[i].w;
            if(edge[i].cap && dis[v] > dis[u] + w)
            {
                dis[v] = dis[u] + w;
                pre[v] = u;
                last[v] = i;
                flow[v] = min(flow[u], edge[i].cap);
                if(! use[v])
                {
                    q.push(v);
                    use[v] = 1;
                }
            }
        }
    }
    if(flow[e] != INF)
        return true;
    return false;
}
void MCMF(int s, int e)
{
    while(Spfa(s, e))
    {
        mx_flw += flow[e];
        mn_cst += flow[e]*1LL * dis[e]*1LL;
        int now = e;
        while(now != s)     //更新 残量
        {
            edge[last[now]].cap -= flow[e];
            edge[last[now]^1].cap += flow[e];
            now = pre[now];
        }
    }
}
void init()
{
    k = -1;
    for(int i = 0; i <= n; i ++)
        head[i] = -1;
    mx_flw = 0, mn_cst = 0;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    //freopen("T.txt","r",stdin);
    while(cin >> n >> m >> s >> e)
    {
        init();
        int u, v, cap, w;
        for(int i = 1; i <= m; i ++)
            cin >> u >> v >> cap >> w, Add(u, v, w, cap);
        MCMF(s, e);
        cout << mx_flw << " " << mn_cst << endl;
    }
    return 0;
}
												
											P3381 【模板】最小费用最大流(MCMF)的更多相关文章
- P3381 [模板] 最小费用最大流
		
EK + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...
 - 把人都送到房子里的最小花费--最小费用最大流MCMF
		
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费 ...
 - POJ 2195 - Going Home - [最小费用最大流][MCMF模板]
		
题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description On a grid ma ...
 - 【洛谷 p3381】模板-最小费用最大流(图论)
		
题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...
 - 网络流--最小费用最大流MCMF模板
		
标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...
 - 洛谷P3381 (最小费用最大流模板)
		
记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...
 - 洛谷.3381.[模板]最小费用最大流(zkw)
		
题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...
 - POJ-2516(最小费用最大流+MCMF算法)
		
Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源 ...
 - POJ-2195(最小费用最大流+MCMF算法)
		
Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...
 - 最小费用最大流MCMF 最小增广
		
没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...
 
随机推荐
- ubuntu16.04设置开机自启服务
			
网上说了开机自启有许多种方法: 1.最简单的是:在/etc/rc.local的exit 0前面加上你启动服务的脚本文件路径 注:这个脚本文件应写绝对路径! 2.网上:修改rc.local开头的#/bi ...
 - Python基础-生物信息:找出基因,生物学家使用字母A、C、T和G构成的字符串建模一个基因组。
			
生物信息:找出基因,生物学家使用字母A.C.T和G构成的字符串建模一个基因组.一个基因是基因组的子串,它从三元组ATG后开始在三元组TAG.TAA或TGA之前结束.此外,基因字符串的长度是3的倍数,而 ...
 - 必备技能六、Vue框架引入JS库的正确姿势
			
在Vue.js应用中,可能需要引入Lodash,Moment,Axios,Async等非常好用的JavaScript库.当项目变得复杂庞大,通常会将代码进行模块化拆分.可能还需要跑在不同的环境下,比如 ...
 - JS的类
			
JS在创建之初不支持类,因为很多开发者为处理类创建了好多代码库,最终导致ES6引入了类. ES5及更早的版本都不支持类,与类最接近的是:创建一个构造器,然后将方法指派到该构造器的原型上.就是原型继承. ...
 - 结题报告--P2441角色属性树
			
题目:点此 题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长……. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素 ...
 - 开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?
			
起因 - 又是一封邮件 2020 年 3 月 2 日,收到了一封邮件,对,这次故事的起因又是一封邮件,和上次写个bug被国家信息安全漏洞共享平台抓到了一样. 这是一条评论通知邮件,一开始我以为只是正常 ...
 - 前端BOM和DOM
			
前端基础之BOM和DOM 前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些 ...
 - Redis入门学习(学习过程记录)
			
Redis(入门笔记) 学习一个大的技术点,然后顺带着就把这个技术点的面试题给学习了. 学习完一个技术后,如果面试题还不能够解答的话,只能说明学的不精,需要查漏补缺. 下一个学习的方向:Redis-非 ...
 - Fluent算例精选|03利用VOF和蒸发-冷凝模型
			
通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...
 - 灵感来袭,基于Redis的分布式延迟队列
			
延迟队列 延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费.比如1分钟之后发送短信,发送邮件,检测数据状态等. Redisson Delayed Queue 如果你项目中使用了re ...
 
			
		