https://www.luogu.org/problem/P3381

题目描述

如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。

输入格式

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。

输出格式

一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用。

 输入 
4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5
 输出

50 280
 #include<stdio.h>
#include<string.h>
#include<queue>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int MAXN = 1e5 + ;
const int inf = 0x3f3f3f3f; int n, m, st, ed;//点数 边数 源点 汇点
int vis[MAXN], dis[MAXN], flow[MAXN];//源点到i点的花费和流量
int pre[MAXN];//每个点的前驱
int last[MAXN]; //每个点连的前一条边
int mincost, maxflow;
queue<int> Q; struct Edge
{
int to, next, flow, dis;//费用作为 dis 来跑最短路
}edge[MAXN];
int head[MAXN], cnt; void add(int a, int b, int c, int d) //要用到 ^ 操作 所以边从 0 开始
{
edge[++ cnt].to = b;
edge[cnt].next = head[a];
edge[cnt].flow = c;
edge[cnt].dis = d;
head[a] = cnt;
} bool spfa(int st, int ed)
{
mem(dis, inf), mem(flow, inf), mem(vis, );//找到最大流以及最短路(最少费用)
Q.push(st);
vis[st] = ;
dis[st] = ;
pre[ed] = -;
while(!Q.empty())
{
int now = Q.front();
Q.pop();
vis[now] = ;
for(int i = head[now]; i != -; i = edge[i].next)
{
if(edge[i].flow > && dis[edge[i].to] > dis[now] + edge[i].dis)
{
dis[edge[i].to] = dis[now] + edge[i].dis;
pre[edge[i].to] = now;//记录更新后的新前驱
last[edge[i].to] = i;//记录更新后的新的前一条边 为了回溯来更新边的流量
flow[edge[i].to] = min(flow[now], edge[i].flow);//找出最大流
if(!vis[edge[i].to])
{
vis[edge[i].to] = ;
Q.push(edge[i].to);
}
}
}
}
return pre[ed] != -;
} void min_cost_max_flow()
{
while(spfa(st, ed))
{
int now = ed;
maxflow += flow[ed];
mincost += flow[ed] * dis[ed];
while(now != st)//从汇点回溯更新边剩下的流量
{
edge[last[now]].flow -= flow[ed];
edge[last[now] ^ ].flow += flow[ed];
now = pre[now];
}
}
} int main()
{
mem(head, -), cnt = -;
scanf("%d%d%d%d", &n, &m, &st, &ed);
for(int i = ; i <= m; i ++)
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d); //有向边起点 终点 容量 单位费用
add(a, b, c, d);
add(b, a, , -d);//反向边流量为 0 ,花费为 负的
}
min_cost_max_flow();
printf("%d %d\n", maxflow, mincost);
return ;
}

最小费用最大流模板



洛谷P3381 最小费用最大流模板的更多相关文章

  1. 洛谷P3381 最小费用最大流

    费用流板子 还是一道板子题..先练练手 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset( ...

  2. 洛谷 [P3381] 最小费用最大流模版

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  3. 【Luogu】P3381最小费用最大流模板(SPFA找增广路)

    题目链接 哈  学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...

  4. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  5. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  6. 最大流 && 最小费用最大流模板

    模板从  这里   搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...

  7. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

  8. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  9. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

随机推荐

  1. React项目性能优化

    1. 使用生产版本和Fragment 1. 生产版本 确保发布的代码是生产模式下(压缩)打包的代码. 一般运行npm run build命令. 直接从webpack看配置文件,需要设置mode = ' ...

  2. 2019牛客暑期多校训练营(第六场)E 构造、原图是补图的同构图

    https://ac.nowcoder.com/acm/contest/886#question 题意  问是否存在某个n个点的无向图G是其补图H的同构图,若存在输出G的邻接矩阵以及H关于G的映射. ...

  3. spark学习笔记之面试

    spark常见面试 map与flatMap的区别 题:以下代码输出有什么不同 val books=List("Hadoop","Hive","HDFS ...

  4. 学院管理系统(mysql版)

    需求 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上 ...

  5. W: GPG error: http://ppa.launchpad.net trusty InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8CF63AD3F06FC659

    报错信息: W: GPG error: http://ppa.launchpad.net trusty InRelease: The following signatures couldn't be ...

  6. AE开发之默认滚轮缩放功能反置(C#修改注册表数据)

    ArcMap默认的滚轮缩放是向下放大,向上缩小 如果想修改成向上放大,向下缩小,直接在ArcMap-Customize-ArcMap Options里, 将最下面的Mouse Wheel and Co ...

  7. UVALive 3716 DNA Regions ——(式子变形)

    一开始直接想到了二分,写了一发然后过了全部样例就交了,果断WA.因为这个问题显然是不满足单调性的. 然后想之前刚做的斜率优化DP,但是那个是求斜率最大值,不是求满足斜率大于一定值的最大长度的.也构造不 ...

  8. wqy的C题

    wqy的C题 毒瘤! 题意: 你有一张 $ n $ 个点 $ m $ 条边的无向图. 你想在这张图上添加 $ n $ 条有向边,每一条有向边连接两个点 $ u,v $ ,你需要保证 $ u,v $ 在 ...

  9. 我对java多进程多线程的浅显理解

    linux内核调度算法--CPU时间片如何分配: http://blog.csdn.net/russell_tao/article/details/7103012(转载)  ,通过该文章我们知道了进程 ...

  10. 冲刺阶段——Day5

    [今日进展] 完成注册功能代码 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionLi ...