首页 > 其他分享 >最短路树

最短路树

时间:2023-11-15 16:49:00浏览次数:29  
标签:dij int 短路 最小 更新 dis

定义

最短路树:以图上一个点为根节点,删去部分边后所形成的树,树的边权满足任意一点与根结点的路径长度等于图上两点的最短路径长度。

求法

可以采用 dij 求解。
每次更新 \(dis_v\) 时,记录每个点最后一次用来更新的边,即为最短路树。

核心代码如下,时间复杂度为 dij 的时间复杂度即 \(m\log m\) 或 \(n^2\)。

for(int i=head[u];i;i=nxt[i]){
	int v = to[i];
	int w = val[i];
	if(dis[v] > dis[u] + w){
		dis[v] = dis[u] + w;
		pre[v] = i;
	}
}

例题

CF545E

本题要求最短路树的总边权最小,只需做如下修改:

if(dis[v] >= dis[u] + w){
	dis[v] = dis[u] + w;
	pre[v] = i;
}

证明如下:
对于每个点 \(v\) 满足最短路树性质时 \(dis_v\) 已经达到最小时,我们发现此时可能还有几条路径可能将其更新为该最小的 \(dis_v\)。

根据堆优化 dij 的性质,先更新的 \(dis_v\) 一定较小,但是又因为 \(dis_u = dis_v + w_{u,v}\),所以当 \(dis_v\) 最大时,\(w_{u,v}\) 最小。

所以我们选取最晚更新的 \(dis_v\) 所对应的边所构成的最短路树边权一定最小。

标签:dij,int,短路,最小,更新,dis
From: https://www.cnblogs.com/WhileTrueRP/p/zui_duan_lu_shu.html

相关文章

  • 图论——最短路 学习笔记
    图论——最短路学习笔记其实是复习性质的,主要是总结,证明什么的,等上大学再说。定义单源最短路:从一个点\(q\)出发,到其他所有点的最短路。全源最短路:任意两点见最短路。算法对比算法FloydJohnsonBellman–FordSPFADijkstra类型全源全源单源单源单源......
  • 最短路径问题
    有权图的单源最短路算法Dijkstra算法给定任何一个非负权边的图$v_0,....v_n$,要找到\(v_0\)到\(v_m\)的最短路径。设已找到的最短路径的结点集合为\(S\),未找到最短路径的结点集合为\(T\),\(V_0\)到所有结点的最短路径数组为\(dist\),初始状态\(dist[0]=0,dist[1..n]=......
  • [图论]-分层图最短路
    引言——“分层图最短路”顾名思意,可以知道是在分层的图上跑最短路得算法。当我开始学习这个算法是,看到这个算法名,总有些雨里雾里的。什么是分层,为什么要分层,怎么分层?概念概念:分层图最短路的模型就是在最短路模型的基础上加上$k$个决策。这$k$个决策,并不会影响图得结构,只影......
  • 同余最短路学习笔记
    今天讲课讲到了同余最短路。简单记一下,防止之后忘了这个坑。同余最短路inoiwiki简介同余最短路,可以用来处理问题:1.「给定n个数,求这些数能拼出多少其他数(选数数量不限)」2.「给n个数,求这些数不能拼出的最大or最小值」3.「至少拼几次才能拼出模k余x的数」。同余最......
  • [图论]最短路
    单源最短路P3371【模板】单源最短路径(弱化版)P4779【模板】单源最短路径(标准版)dijkstra时间复杂度为$\mathcal{O(n^2)}#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+8;intn,m,s,d[N];intcnt,head[N];boolv[N];structedge{ intto,next,d;}e[......
  • spfa算法(求最短路和判断是否存在负环)floyd求最短路(11/1)
    #include<iostream>#include<cstring>#include<algorithm>#include<queue>usingnamespacestd;constintN=100010;intn,m;inth[N];intne[N];inte[N],w[N],idx=0;intdist[N];boolst[N];voidadd(inta,intb,intc){ne[idx]=......
  • 逻辑运算符 && 和 || 的短路特性
    ⛩️博主主页:@威化小餅干......
  • 最短路(10/25)
    n是点数  m是边数退优化版的适合点数和边数差不多(3)适合对边有限制稠密图用邻接矩阵存稀疏图用邻接表来存朴素dijkstra#include<cstring>#include<iostream>usingnamespacestd;intn,m;constintN=510;intg[N][N];//记录点之间的权值intdist[N];//记录点到原......
  • 深度优先搜索的最短路径问题
    这个简单的图,要求使用深度优先算法求出(1,1)到终点的最短路径。1、分析就目前看来,(1,1)->(1,2)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,3)和(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(5,2)->(5,3)->(4,3)这两条路径是相同的长度的最短路劲。但是,这是我们的肉眼看到的,如果是计算机计......
  • 第K短路相关证明
    Dijkstra正确性证明采用反证法+数学归纳法设目前已经出对的点得到的都是最短路,那么对于现在刚好出队这个点t来说:因为它是优先队列的对头,而且图中的边权都是非负数,所以它不可能被队列中的点再更新因为每个点只会出队一次,所以它也不会被已经出队的点再次更新还没有入队的点距......