P3381 [模板] 最小费用最大流
EK + dijkstra (2246ms) 开氧气(586ms)
dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9; int n, m, s, t, cnt; struct node {
int to, nex, val, cost;
}E[100005];
int head[5005]; void addedge(int x, int y, int va, int cos) {
E[++cnt].to = y; E[cnt].nex = head[x]; head[x] = cnt; E[cnt].val = va; E[cnt].cost = cos;
} struct no1 {
int to, edge;
}pre[5005]; struct no2 {
int d, id;
friend bool operator < (no2 A, no2 B) {
return A.d > B.d;
}
}; int dis[5005];
int h[5005];
bool dij() { for(int i = 1; i <= n; i++) dis[i] = INF;
priority_queue<no2> que; dis[s] = 0;
que.push((no2){0, s}); while(!que.empty()) {
no2 u = que.top();
que.pop();
if(dis[u.id] < u.d) continue; for(int i = head[u.id]; i; i = E[i].nex) {
int v = E[i].to;
if(E[i].val > 0 && dis[v] + h[v] > dis[u.id] + E[i].cost + h[u.id]) {
dis[v] = dis[u.id] + E[i].cost + h[u.id] - h[v];
pre[v].to = u.id;
pre[v].edge = i;
que.push((no2){dis[v], v});
}
}
}
if(dis[t] != INF) return true;
else return false;
} int ans, cos1;
void EK() {
ans = cos1 = 0; while(dij()) {
int mi = INF;
for(int i = t; i != s; i = pre[i].to) {
mi = min(mi, E[pre[i].edge].val);
}
for(int i = t; i != s; i = pre[i].to) {
E[pre[i].edge].val -= mi;
E[pre[i].edge ^ 1].val += mi;
}
for(int i = 1; i <= n; i++) h[i] += dis[i];
ans += mi;
cos1 += mi * h[t];
}
} int main() {
scanf("%d%d%d%d", &n, &m, &s, &t);
cnt = 1; for(int i = 1; i <= m; i++) {
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
addedge(a, b, c, d);
addedge(b, a, 0, -d);
}
EK();
printf("%d %d\n", ans, cos1);
return 0;
}
EK + spfa (1775ms) 开氧气(1398ms)
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9; int n, m, s, t, cnt; struct node {
int to, nex, val, cost;
}E[100005];
int head[5005]; void addedge(int x, int y, int va, int cos) {
E[++cnt].to = y; E[cnt].nex = head[x]; head[x] = cnt; E[cnt].val = va; E[cnt].cost = cos;
} struct no1 {
int to, edge;
}pre[5005]; int dis[5005];
int vis[5005]; bool spfa() {
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f, sizeof(dis)); queue<int> que;
que.push(s);
vis[s] = 1;
dis[s] = 0;
while(!que.empty()) {
int u = que.front();
vis[u] = 0;
que.pop(); for(int i = head[u]; i; i = E[i].nex) {
int v = E[i].to;
if(E[i].val > 0 && dis[v] > dis[u] + E[i].cost) {
dis[v] = dis[u] + E[i].cost;
pre[v].to = u;
pre[v].edge = i;
if(!vis[v]) {
vis[v] = 1;
que.push(v);
}
}
}
}
if(dis[t] != 0x3f3f3f3f) return true;
else return false;
} int ans, cos1;
void EK() {
ans = cos1 = 0; while(spfa()) {
int mi = INF;
for(int i = t; i != s; i = pre[i].to) {
mi = min(mi, E[pre[i].edge].val);
}
for(int i = t; i != s; i = pre[i].to) {
E[pre[i].edge].val -= mi;
E[pre[i].edge ^ 1].val += mi;
}
ans += mi;
cos1 += mi * dis[t];
}
} int main() {
scanf("%d%d%d%d", &n, &m, &s, &t);
cnt = 1; for(int i = 1; i <= m; i++) {
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
addedge(a, b, c, d);
addedge(b, a, 0, -d);
}
EK();
printf("%d %d\n", ans, cos1);
return 0;
}
Dinic多路增广 + 弧优化 + spfa (1744ms)
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9; int n, m, s, t, cnt;
int maxflow, mincost; struct node {
int to, nex, val, cost;
}E[100005];
int head[5005];
int cur[5005]; void addedge(int x, int y, int va, int cos) {
E[++cnt].to = y; E[cnt].nex = head[x]; head[x] = cnt; E[cnt].val = va; E[cnt].cost = cos;
} struct no1 {
int to, edge;
}pre[5005]; int dis[5005];
int inque[5005];
int vis[5005]; bool spfa() {
for(int i = 1; i <= n; i++) inque[i] = 0, dis[i] = 0x3f3f3f3f, cur[i] = head[i], vis[i] = 0; queue<int> que;
que.push(s);
inque[s] = 1;
dis[s] = 0;
while(!que.empty()) {
int u = que.front();
inque[u] = 0;
que.pop(); for(int i = head[u]; i; i = E[i].nex) {
int v = E[i].to;
if(E[i].val > 0 && dis[v] > dis[u] + E[i].cost) {
dis[v] = dis[u] + E[i].cost;
pre[v].to = u;
pre[v].edge = i;
if(!inque[v]) {
inque[v] = 1;
que.push(v);
}
}
}
}
if(dis[t] != 0x3f3f3f3f) return true;
else return false;
} int dfs(int x, int flow) {
if(x == t) {
vis[x] = 1;
maxflow += flow;
return flow;
} vis[x] = 1;
int used = 0;
int rflow = 0;
for(int i = cur[x]; i; i = E[i].nex) {
cur[x] = i;
int v = E[i].to;
if(E[i].val > 0 && dis[v] == dis[x] + E[i].cost && (!vis[v] || v == t)) {
if(rflow = dfs(v, min(flow - used, E[i].val))) {
used += rflow;
E[i].val -= rflow;
E[i ^ 1].val += rflow;
mincost += E[i].cost * rflow;
if(used == flow) break;
}
}
}
return used;
} void dinic() {
maxflow = mincost = 0;
while(spfa()) {
vis[t] = 1;
while(vis[t]) {
memset(vis, 0, sizeof(vis));
dfs(s, INF);
}
}
} int main() {
scanf("%d%d%d%d", &n, &m, &s, &t);
cnt = 1; for(int i = 1; i <= m; i++) {
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
addedge(a, b, c, d);
addedge(b, a, 0, -d);
}
dinic();
printf("%d %d\n", maxflow, mincost);
return 0;
}
P3381 [模板] 最小费用最大流的更多相关文章
- 【洛谷 p3381】模板-最小费用最大流(图论)
题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...
- 洛谷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 ...
- P3381 【模板】最小费用最大流
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- P3381 【模板】最小费用最大流(MCMF)
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N ...
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
随机推荐
- 十八般武艺玩转GaussDB(DWS)性能调优:路径干预
摘要:路径生成是表关联方式确定的主要阶段,本文介绍了几个影响路径生成的要素:cost_param, scan方式,join方式,stream方式,并从原理上分析如何干预路径的生成. 一.cost模型选 ...
- 了解一下RPC,为何诞生RPC,和HTTP有什么不同?
了解一下RPC,为何诞生RPC,和HTTP有什么不同? 开篇提问 什么是RPC? 为什么需要RPC,用来解决什么问题? RPC与HTTP有什么不同? 你知道几种RPC? 认识RPC RPC:Remot ...
- 剑指offer 面试题7:重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 一文带你探究Sentinel的独特初始化
摘要:本系列通过作者对Redis Sentinel源码的理解,详细说明Sentinel的代码实现方式. Redis Sentinel 是Redis提供的高可用模型解决方案.Sentinel可以自动监测 ...
- 安装SVN和汉化包及基本使用
官网下载程序 和 下载汉化包. https://tortoisesvn.net/ 注意SVN汉化包版本需要和SVN版本一致,否则是无效的. 一.下载 1.进入官网,点击downloads 2.点击 ...
- java环境配置-win10(傻瓜式教程)
java环境配置 – 小学弟要开始学java了,由于本人较懒,表达能力有限,所以来这,写一篇简单的指导,帮学弟装下java环境. 首先打开浏览器,输入这个网址https://www.oracle.co ...
- .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记
2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...
- Redis-4.X 版本 Redis Cluster集群 (一)
一 创建redis cluster 集群前提条件: 1 ) 每个redis node 节点采用相同的硬件配置,相同的密码. 2 ) 每个节点必须开启的参数: cluster-enabled yes # ...
- Linux 使用命令行上传下载文件
基本语法: 服务器: 用户名@ip:/路径 scp 要拷贝的文件 要存放的文件 上传文件到服务器 # 把本地 source.md 文件上传到 152.116.113.13 服务器的/home目录 # ...
- buuctf刷题之旅—web—随便注
打开环境 根据提示应该是sql注入 查看数据库名,和数据表 1';show databases;# 1';show tables;# 查看表内字段(1';desc `1919810931114514` ...