Primal_Dual 原始对偶
不是费用流都需要用 SPFA 吗。
众所周知,SPFA 去世了,然后网络流显然有负边。于是我们可以像 Johnson 全源最短路一样,给边加上势能,具体实现看我之前的 博客 啦。
然后对于每一次跑 Dijkstra ,然后得到最短路,把势能要再加上这个最短路,可以证明这样操作一次图上不会再有负边。
也正因如此我们不能用 \(dinic\) ,我们不保证在走了多条增广路后仍然边权非负,所以我们可以记录最短路的路径,然后每次增广一条,这样就能保证正确。这个似乎是 KM算法吗?反正都是增广一条,没有学过KM,所以不敢下定论。
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout)
inline int read(){
int s=0,f=1;char ch=getchar();
while(ch<'0'||'9'<ch) {if(ch=='-') f=-1;ch=getchar();}
while('0'<=ch&&ch<='9') {s=s*10+(ch^48);ch=getchar();}
return s*f;
}
const int N=5e3+3;
const int INF=0x3f3f3f3f;
int n,m,S,T;
struct Edge{
int v,w,c;
};
vector<int>head,nxt;
vector<Edge>to;
inline void join(int u,int v,int w,int c){
nxt.push_back(head[u]);
head[u]=to.size();
to.push_back({v,w,c});
}
queue<int>Q;
int h[N];
bool inq[N];
inline void spfa(){
for(int i=1;i<=n;++i) h[i]=INF,inq[i]=0;
h[S]=0;Q.push(S);inq[S]=1;h[S]=0;
while(!Q.empty() ){
int u=Q.front();Q.pop();inq[u]=0;
for(int i=head[u];~i;i=nxt[i]){
int v=to[i].v,c=to[i].c,w=to[i].w;
if(w and h[v]>h[u]+c){
h[v]=h[u]+c;
if(!inq[v]){
inq[v]=1;
Q.push(v);
}
}
}
}
}
int dis[N];
struct node{
int d,x;
inline friend bool operator <(node x,node y){
return x.d<y.d;
}
};
int cur[N];bool vis[N];
struct way{
int v,id;
}e[N];
priority_queue<node>q;
inline bool dijkstra(){
while(!q.empty() ) q.pop();
for(int i=1;i<=n;++i) dis[i]=INF,vis[i]=0;
dis[S]=0;q.push({0,S});
while(!q.empty() ){
int u=q.top().x;q.pop();
if(vis[u]) continue;vis[u]=1;
for(int i=head[u];~i;i=nxt[i]){
int v=to[i].v,w=to[i].w,c=to[i].c+h[u]-h[v];
if(w and dis[v]>dis[u]+c){
e[v].v=u;
e[v].id=i;
dis[v]=dis[u]+c;
if(!vis[v]){
q.push({-dis[v],v});
}
}
}
}
return dis[T]!=INF;
}
int minc,maxf;
inline void PD(){
while(dijkstra() ){
for(int i=S;i<=T;++i) h[i]+=dis[i];
ll minf=INF;
for(int i=T;i!=S;i=e[i].v){
minf=min(minf,to[e[i].id].w);
}
for(int i=T;i!=S;i=e[i].v){
to[e[i].id].w-=minf;
to[e[i].id^1].w+=minf;
minc+=minf*to[e[i].id].c;
}
maxf+=minf;
}
}
int main(){
//file(a);
//freopen("a.in","r",stdin);
n=read();m=read();S=read();T=read();
head.resize(n+1,-1);
for(int i=1;i<=m;++i){
int u=read(),v=read(),w=read(),c=read();
join(u,v,w,c);join(v,u,0,-c);
}
spfa();
PD();
printf("%d %d\n",maxf,minc);
return 0;
}
Primal_Dual 原始对偶的更多相关文章
- 费用流 Dijkstra 原始对偶方法(primal-dual method)
简单叙述用Dijkstra求费用流 Dijkstra不能求有负权边的最短路. 类似于Johnson算法,我们也可以设计一个势函数,以满足在与原图等价的新图中的边权非负. 但是这个算法并不能处理有负圈的 ...
- Superpixel Based RGB-D Image Segmentation Using Markov Random Field——阅读笔记
1.基本信息 题目:使用马尔科夫场实现基于超像素的RGB-D图像分割: 作者所属:Ferdowsi University of Mashhad(Iron) 发表:2015 International ...
- [转]从入门到精通: 最小费用流的“zkw算法”
>>>> 原文地址:最小费用流的“zkw算法” <<<< 1. 网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本 ...
- 详解zkw算法解决最小费用流问题
网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求规 ...
- 网络流板子/费用流板子 2018南京I题+2016青岛G题
2018南京I题: dinic,链式前向星,数组队列,当前弧优化,不memset全部数组,抛弃满流点,bfs只找一条增广路,每次多路增广 #include <bits/stdc++.h> ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
- 省队集训 Day3 吴清华
[题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止 ...
- 【P2405】方格取数问题加强版(费用流)
考虑如何建图.还是老样子先拆点,然后把每两个点之间连接两条边,一条流量为1,费用为-点权,处理是否走这个点.一条流量无限,没有费用,因为哪怕一个点选过了,它的地方还是可以重复走过去的. 然后把经由一个 ...
- Andrew Ng机器学习笔记+Weka相关算法实现(五)SVM最优间隔和核方法
这一章主要解说Ng的机器学习中SVM的兴许内容.主要包括最优间隔分类器求解.核方法. 最优间隔分类器的求解 利用以一篇讲过的的原始对偶问题求解的思路,我们能够将相似思路运用到SVM的求解上来. 详细的 ...
随机推荐
- Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
报错详细: Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preco ...
- FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码
之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...
- 踩了个DNS解析的坑,但我还是没想通
hello大家好,我是小楼. 最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家. 背景 最近负责的服务要置换机器.置换机器可能很多小伙伴不知道 ...
- vue动态绑定属性--基本用法及动态绑定class
动态绑定属性v-bind:,语法糖形式:省略v-bind,仅写一个冒号. 一.动态绑定基本属性 1 <body> 2 <!-- v-bind 动态绑定属性-基本用法 --> 3 ...
- Spring Authorization Server授权服务器入门
11月8日Spring官方已经强烈建议使用Spring Authorization Server替换已经过时的Spring Security OAuth2.0,距离Spring Security OA ...
- 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)
2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...
- 【Vue3+Express实战】项目开发环境搭建
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- Spring Security实现基于RBAC的权限表达式动态访问控制
昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...
- XCTF练习题---MISC---reverseMe
XCTF练习题---MISC---reverseMe flag:flag{4f7548f93c7bef1dc6a0542cf04e796e} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是个 ...
- ImageKnife组件,让小白也能轻松搞定图片开发
本期我们给大家带来的是开发者周黎生的分享,希望能给你的HarmonyOS开发之旅带来启发~ 图片是UI界面的重要元素之一, 图片加载速度及效果直接影响应用体验.ArkUI开发框架提供了丰富的图像处理能 ...