首页 > 编程语言 >【学习笔记】Primal-Dual 原始对偶算法

【学习笔记】Primal-Dual 原始对偶算法

时间:2023-06-15 20:12:09浏览次数:38  
标签:int Primal 短路 Dijkstra vis 算法 Dual 对偶 dis

Johnson 全源最短路算法

Floyd 可以 \(O(n^3)\) 处理全源最短路,Bellman-Ford 单源最短路的复杂度是 \(O(nm)\) 的,Dijkstra 可以做到 \(O(m\log m)\) 但不能处理负边权,所以 Johnson 全源最短路算法通过处理使得可以用 \(n\) 次 Dijkstra 解决有负权图的全源最短路。

先建超级源点,向各点连边权为 \(0\) 的有向边,跑一次 \(Bellman-Ford\),得到最短路 \(h\),将 \(h_u\) 作为 \(u\) 节点的势能,将 \(d(u,v)\) 改为 \(d'(u,v)=d(u,v)+h_u-h_v\)。

这样在最短路过程中,\(p_1\to p_2\to \cdots\to p_{n-1}\to p_{n}\),最短路值应该是:

\[d'(p_1,p_n)=(d(p_1,p_2)+h_{p_1}-h_{p_2})+(d(p_2,p_3)+h_{p_2}-h_{p_3})+\cdots+(d(p_{n-1},p_n)+h{p_{n-1}}+h_{p_n})=d(p_1,p_n)+h_{p_1}-h_{p_n} \]

注意到之和两端点势能有关,所以按照这个方法去做是可以找到最短路的。

同时根据 \(h_u+d(u,v)\ge h_v\),则 \(d(u,v)+h_u-h_v\ge 0\),也就是一个正权图。

这样复杂度是 \(O(nm\log m)\)。

Primal-Dual 原始对偶算法

其实和上面类似,这个算法解决了不含负环的费用流,复杂度不再是 EK 的上界 \(O(nmf)\),其实就是改变了求最短路的算法。

依旧是从源点 \(S\) 开始跑 Bellman-Ford 记录势能 \(h_u\),边权改为 \(d(u,v)+h_u-h_v\)。

问题在每次增广之后增加并减少了一些边。

这里的解决方案是,每次跑完 Dijkstra,把势能 \(h_u\) 改为 \(h_u+dis_u\),这显然能代表最短路,证明和上面一样,关键是对边权是否全为正的讨论。

证明也是类似的,在上一次跑 Dijkstra 时,原有的边 \((u,v)\) 有 \(dis_u+(d(u,v)+h_u-h_v)\ge dis_v\),于是 \(d(u,v)+(h_u+dis_u)-(h_v+dis_v)\ge 0\),而新增加的边则是一定在最短路上,于是 \(dis_u+(d(u,v)+h_u-h_v)=dis_v\),进而 \(d(v,u)+(h_v+dis_v)-(h_u+dis_u)=0\),边权非负。

这样就可以在 \(O(nm+m\log mf)\) 的复杂度内解决问题,如果图有特殊性质,第一次的 Bellman-Ford 可以换成 BFS 之类的。

点击查看代码
ll h[maxn];
bool vis[maxn];
inline void SPFA(){
    queue<int> q;
    memset(h,0x3f,sizeof(h));
    q.push(S);
    h[S]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i;i=e[i].nxt){
            int v=e[i].to,w=e[i].c;
            if(e[i].lim&&h[u]+w<h[v]){
                h[v]=min(h[v],h[u]+w);
                if(!vis[v]){
                    q.push(v);
                    vis[v]=1;
                }
            }
        }
    }
}
struct node{
    int u;
    ll d;
    node()=default;
    node(int u_,ll d_):u(u_),d(d_){}
    bool operator<(const node& rhs)const{
        return d>rhs.d;
    }  
};
ll dis[maxn];
int pre[maxn];
inline void Dijkstra(){
    priority_queue<node> q;
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    q.push(node(S,0));
    dis[S]=0;
    while(!q.empty()){
        int u=q.top().u;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u];i;i=e[i].nxt){
            int v=e[i].to;
            ll w=e[i].c+h[u]-h[v];
            if(e[i].lim&&dis[u]+w<dis[v]){
                dis[v]=dis[u]+w,pre[v]=i;
                q.push(node(v,dis[v]));
            }
        }
    }
}
inline ll mincost_maxflow(){
    SPFA();
    ll mincost=0;
    while(1){
        Dijkstra();
        if(dis[T]==0x3f3f3f3f3f3f3f3f) return -mincost;
        for(int u=1;u<=T;++u) h[u]+=dis[u];
        int flow=inf;
        for(int u=T;u!=S;u=e[pre[u]^1].to){
            flow=min(flow,e[pre[u]].lim);
        }
        for(int u=T;u!=S;u=e[pre[u]^1].to){
            mincost+=1ll*e[pre[u]].c*flow;
            e[pre[u]].lim-=flow,e[pre[u]^1].lim+=flow;
        }
    }
}

标签:int,Primal,短路,Dijkstra,vis,算法,Dual,对偶,dis
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Primal-Dual_Algorithm.html

相关文章

  • 【数论】Rust使用Miller-Rabin primality test判别素数
    题目地址https://ac.nowcoder.com/acm/contest/57677/A代码usestd::io::{self,BufRead,Write};fnis_prime_triival(n:i128)->bool{ifn<=1{returnfalse;}ifn==2{returntrue;}ifn%2==0{retur......
  • 【BZOJ2007】【NOI2010】海拔(对偶图,最短路)
    DescriptionYT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域。简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形。从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口。下图为......
  • 对偶问题
    对于优化问题max转化为min或min转化为max,编写方程组的方法以max→min为例:1.min方程组的目标函数:约束方程数量为变量数量,乘以对应的常数项得到目标函数2.约束方程:约束方程数量等于变量数量,原方程约束方程第一列系数为变量系数,原目标......
  • 论文阅读笔记《Residual Physics Learning and System Identification for Sim to rea
    ResidualPhysicsLearningandSystemIdentificationforSimtorealTransferofPoliciesonBuoyancyAssistedLeggedRobots发表于2023年。论文较新,未找到发表期刊。基于浮力辅助的足式机器人策略迁移的残差物理学习与系统识别SontakkeN,ChaeH,LeeS,etal.Resi......
  • Perceptron, Support Vector Machine and Dual Optimization Problem (3)
    SupportVectorMachinesPerceptronandLinearSeparability假设存在一个lineardecisionboundary,它可以完美地对trainingdataset进行分割。那么,经由上述PerceptronAlgorithm计算,它将返回哪一条linearseparator?当linearseparator(即一个给定的超平面)的margi......
  • 如何轻松应对偶发异常
    作者:亦盏在之前的文章中,我们已经介绍了如何通过MSE提供的无损上下线和全链路灰度这两个功能来消除变更态的风险,相信您已经能够在变更时得心应手。但是在应用运行过程中突然遇到流量洪峰、黑产刷单、外部依赖故障、慢SQL等偶发异常时,您如何能够继续轻松应对呢?本文将通过介绍MSE......
  • Miller-Rabin primality test
    Assumethatweareaskedif\(n\)isaprime.Fermatprimalitytest:choosesomenumbers\(a_1,a_2,\cdots,a_x<n\)andcheckif\(\foralli,a_i^{n-1}\equiv1\pm......
  • 论文阅读—第二篇《Deep Residual Learning for Image Recognition》
    DeepResidualLearningforImageRecognition论文链接1.简介《DeepResidualLearningforImageRecognition》是2015年由何凯明等人提出的一篇论文,该论文提出了一......
  • 《Spectral Partitioning Residual Network With Spatial Attention Mechanism for Hy
    论文作者:XiangrongZhang,ShouwangShang,XuTang,etal.论文发表年份:2021模型简称:SPRN发表期刊:IEEETransactionsonGeoscienceandRemoteSensing论文链接:Sci-Hub......
  • 感知机:学习算法之对偶形式【统计学习方法】
    概述在原始形式中,若(x_i,y_i)为误分类点,可如下更新参数:$$w\leftarroww+\etay_ix_i;\quadb\leftarrowb+\etay_i$$假设初始值$w_0=\boldsymbol0,b_0=0$,对误分类点$(x_......