题目描述

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

输入

第一行包含四个正整数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

555555本蒟蒻还不会zkw费用流,就先贴Edmond_Karp+SPFA和Primal_Dual的代码吧。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; struct edge {
int to,cap,cost,rev;
}; typedef pair<int,int> P;
const int maxn=, maxm=, INF=0x7F7F7F7F;
int n,m;
vector <edge> G[maxn+]; edge make_edge(int to, int cap, int cost, int rev) {
edge x;
x.to=to, x.cap=cap, x.cost=cost, x.rev=rev;
return x;
} void add_edge(int from, int to, int cap, int cost) {
G[from].push_back(make_edge(to,cap,cost,G[to].size()));
G[to].push_back(make_edge(from,,-cost,G[from].size()-));
} void init(int &s, int &t) {
scanf("%d%d%d%d",&n,&m,&s,&t);
for (int i=; i<=m; i++) {
int u,v,w,f;
scanf("%d%d%d%d",&u,&v,&w,&f);
add_edge(u,v,w,f);
}
} namespace EK_SPFA {
int dis[maxn+];
int prev[maxn+];
int pree[maxn+]; void bfs(int s) {
bool mark[maxn+];
memset(dis,0x7F,sizeof(dis));
memset(prev,-,sizeof(prev));
memset(pree,-,sizeof(pree));
memset(mark,,sizeof(mark));
queue <int> q;
dis[s]=;
q.push(s);
while (!q.empty()) {
int x=q.front();
q.pop();
mark[x]=false;
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&dis[x]+e.cost<dis[e.to]) {
dis[e.to]=dis[x]+e.cost;
prev[e.to]=x;
pree[e.to]=i;
if (!mark[e.to]) {
mark[e.to]=true;
q.push(e.to);
}
}
}
}
} P min_cost_max_flow(int s, int t) {
int flow=, cost=;
for(;;) {
bfs(s);
if (dis[t]==INF)
return make_pair(flow,cost);
int d=INF;
for (int i=t; prev[i]!=-; i=prev[i])
d=min(d,G[prev[i]][pree[i]].cap);
flow+=d;
cost+=d*dis[t];
for (int i=t; prev[i]!=-; i=prev[i]) {
edge &e=G[prev[i]][pree[i]];
e.cap-=d;
G[e.to][e.rev].cap+=d;
}
}
}
} namespace Primal_Dual {
int dis[maxn+];
int h[maxn+];
int prev[maxn+];
int pree[maxn+]; void bfs(int s) {
priority_queue <P, vector<P>, greater<P> > q;
bool vis[maxn+];
memset(vis,,sizeof(vis));
memset(dis,0x7F,sizeof(dis));
memset(prev,-,sizeof(prev));
memset(pree,-,sizeof(pree));
dis[s]=;
q.push(make_pair(,s));
while (!q.empty()) {
int val=q.top().first, x=q.top().second;
q.pop();
if (vis[x]) continue;
vis[x]=true;
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&dis[x]+e.cost+h[x]-h[e.to]<dis[e.to]&&!vis[e.to]) {
dis[e.to]=dis[x]+e.cost+h[x]-h[e.to];
prev[e.to]=x;
pree[e.to]=i;
q.push(make_pair(dis[e.to],e.to));
}
}
}
} P min_cost_max_flow(int s, int t) {
int flow=, cost=;
memset(h,,sizeof(h));
for(;;) {
bfs(s);
if (dis[t]==INF)
return make_pair(flow,cost);
for (int i=; i<=n; i++)
h[i]+=dis[i];
int d=INF;
for (int i=t; prev[i]!=-; i=prev[i])
d=min(d,G[prev[i]][pree[i]].cap);
flow+=d;
cost+=d*h[t];
for (int i=t; prev[i]!=-; i=prev[i]) {
edge &e=G[prev[i]][pree[i]];
e.cap-=d;
G[e.to][e.rev].cap+=d;
}
}
}
} int main() {
int s,t;
init(s,t);
P ans=Primal_Dual::min_cost_max_flow(s,t);
printf("%d %d\n",ans.first,ans.second);
return ;
}

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

  1. 洛谷P3381 (最小费用最大流模板)

    记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...

  2. 洛谷.3381.[模板]最小费用最大流(zkw)

    题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...

  3. P3381 [模板] 最小费用最大流

    EK  + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...

  4. 【洛谷 p3381】模板-最小费用最大流(图论)

    题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...

  5. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  6. 网络流_spfa最小费用最大流

    最大流: 不断搜索增广路,寻找最小的容量-流量,得到最大流量,但最大流量在有花费时不一定是最小花费. 最小费用最大流 算法思想: 采用贪心的思想,每次找到一条从源点到达汇点的花费最小的路径,增加流量, ...

  7. 洛谷P3381 最小费用最大流模板

    https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...

  8. 洛谷P3381 - 【模板】最小费用最大流

    原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...

  9. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  10. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

随机推荐

  1. linux 对MTD分区nand flash的烧写和读取

    使用mtd-utils工具实现对flash的升级分区的烧写yaffs2 yaffs2的格式是根据所使用的nandflash来制作的,不同的nandflash,得到的yaffs2是不一样的,具体可以参考 ...

  2. python基础-->流程控制-->分支结构-->单项分支-->双向分支

    # ###流程控制 ''' 流程:代码执行过程 流程控制:对代码执行过程的管控 顺序结构:代码默认从上到下依次执行 分支结构:对代码执行过程的管控 循环机构: while for ..in.... 分 ...

  3. Modelsimobjects空白无显示问题和ISim仿真时出现空白

    困扰朕长达一周的问题得以解决!!!!! 发生这种情况的根源是win10自带的防火墙的问题.只有关闭防火墙,再重新打开软件进行仿真就能出现正常的仿真界面. 关闭防火墙的方法为:控制面板>>系 ...

  4. 时区切换导致quartz定时任务没有触发问题

    时区切换对Quartz的cron表达式有影响,切换的1小时内停止触发定时任务,导致sla没有定时清空内存计数,误发限流. 美国夏令时PST切换到冬令时PDT,会有时间跳变.不带时区跳变的,会出现时间重 ...

  5. ORA-27300 ORA-27301 ORA-27302 sskgpcreates

    1.环境信息 OS:SUSE 12SP3 DB:12.2.0.1.0 2.数据库启动失败 SQL> startup ORA-27154: post/wait create failed ORA- ...

  6. 18. C# 转换

    1.重载转换运算符 到目前为止,我们使用的类型转换,包括隐式类型转换和显示类型转换都是在两个相关的类中进行的,这几个类要么是简单类型之间的转换,比如int 隐式转换成double,要么是有继承关系,或 ...

  7. feifeicms后台任意文件读取

    前台大略看了下,本身内容比较简单,经过“洗礼”后以及没什么问题了,基本上输入都过滤了. 这次审计找到了一个后台的任意文件读取,可以读取数据库配置文件. 在DataAction.class.php文件中 ...

  8. 监听auduo标签播放

    <audio id="audio" controls="controls" loop="loop" style="displ ...

  9. oracle中 sql%rowcount 用法

    sql%rowcount用于记录修改的条数,必须放在一个更新或者删除等修改类语句后面执行,select语句用于查询的话无法使用, 当你执行多条修改语句时,按照sql%rowcount 之前执行的最后一 ...

  10. idea 2018.1 for mac破解激活方法---到2099

    https://blog.csdn.net/weixin_41470864/article/details/81607169