@@ -413,7 +413,7 @@ int main(){
413413 - 时间复杂度:$O(ElogE)$
414414- Prim算法
415415 - 贪心策略:Prim算法中,$A$一直保持单棵树,每一次加入的安全边,总是连接树和一个不在树中的顶点,并且这条安全边是当前可选的安全边中最短的一个。
416- - 时间复杂度:$O(ElogV)$,斐波那契堆优化下能更快 。
416+ - 时间复杂度:$O(ElogV)$,[斐波那契堆]({{<relref "/content/post/CSBasic/algo7-tree.md#斐波那契堆">}})优化下能更快 。
417417 - 注意$O(ElogV)$和$O(ElogE)$并没有本质区别,因为$|E|\le|V|^2$,易知$O(logE)=O(logV)$
418418 - 优化:
419419``` cpp
@@ -606,7 +606,7 @@ int main() {
606606 - 路径松弛定理:若$p=<v_0,v_1,...,v_k>$是一条最短路径,且对$p$的边按照$(v_0,v_1)(v_1,v_2)...(v_{k-1},v_k)$进行松弛,则$d[v_k]=\delta(s,v_k)$。
607607 - 前驱子图性质:一旦对于所有$v\in V,d[v]=\delta(s,v)$,则前驱子图构成一个以s为根的最短路径树。
608608### 单源最短路
609- - Dijkstra算法:不存在负权边的情况下,时间复杂度$O(V^2)$,斐波那契堆优化下能更快 。
609+ - Dijkstra算法:不存在负权边的情况下,时间复杂度$O(V^2)$,[斐波那契堆]({{<relref "/content/post/CSBasic/algo7-tree.md#斐波那契堆">}})优化下能更快 。
610610 - 基本思路:
611611 1. 初始化最短路径估计
612612 2. 初始化已获得最短路径的顶点集合,空集$S$
@@ -714,6 +714,19 @@ int main(){
714714 return 0;
715715 }
716716```
717+ - A\* 算法:一种针对单源点,单终点的启发式算法,是对Dijkstra算法的一个扩展。其结果并不总是准确的,但可以通过调整达到满意的要求。
718+ - 基本思路:
719+ - 待优化公式:对于从源点$s$经过$u$到终点$v$的最短路径估计函数$f[v]$,令$f[v]=d(s,u)+h(u,v)$,其中
720+ - $d(s,u)$是起点到当前点$u$的最短路径估计
721+ - $h(u,v)$是当前点$u$到终点$v$的代价估计,是一个启发式函数
722+ - 每一轮广搜,都选择当前具有最小$d[u]$的节点$v$进行扩展
723+ - 特例:
724+ - 当$h(u,v) = 0$,则该方法就是Dijkstra算法
725+ - 否则,根据应用场景不同,可以选择对应的简单启发函数
726+ - 图中仅允许四向移动:取曼哈顿距离(水平和垂直距离的和)
727+ - 图中允许八向移动:使用对角线距离(水平和垂直距离的最大值)
728+ - 图中允许全向移动:使用欧式距离
729+ - 其他情况,根据$d$和$h$的大小不同,算法有不同的性能和准确性表现
717730- Bellman-Ford算法:存在负权边的情况下,解决单源最短路径问题。时间复杂度$O(VE)$。
718731 - 基本思路:
719732 1. 初始化最短路径估计
@@ -829,7 +842,7 @@ int main(){
829842 - 和图算法的关系:可以将差分约束转换为最短路径问题。
830843 - 转换为图$G=(V,E)$,其中$V=\\{v_0,v_1,...,v_n\\}$,$E=\\{(v_i,v_j):x_j-x_i\le b_k\mathrm{是一个约束条件}\\}\cup \\{(v_0,v_1),(v_0,v_2),...,(v_0,v_n)\\}$。另外对于约束$x_j-x_i\le b_k$,边$(v_i,v_j)$具有权$w(v_i,v_j)=b_k$,而其他边则有$w(v_0,v_i)=0,1\le i \le n$。
831844 - 引入逻辑顶点$v_0$保证每个顶点均可从$v_0$到达。其他顶点就是未知元,边代表具有约束关系。
832- - 给定一差分约束系统$Ax\le b$,设$G=(V,E)$未其相应的约束图 。如果$G$不包含负权回路。则系统的一个可行解为:
845+ - 给定一差分约束系统$Ax\le b$,设$G=(V,E)$为其相应的约束图 。如果$G$不包含负权回路。则系统的一个可行解为:
833846 </br><center>
834847 $x=(\delta(v_0,v_1),\delta(v_0,v_2),...,\delta(v_0,v_n))$
835848 </center>
@@ -875,13 +888,13 @@ int main(){
875888 return 0;
876889}
877890```
878- - Johnson算法:简单版时间复杂度可达$O(VElogV)$,斐波那契堆优化可达 $O(V^2logV+VE)$,稀疏图更快
891+ - Johnson算法:简单版时间复杂度可达$O(VElogV)$,[ 斐波那契堆 ] ({{<relref "/content/post/CSBasic/algo7-tree.md#斐波那契堆">}})优化可达 $O(V^2logV+VE)$,稀疏图更快
879892 - 重赋权技术:
880893 - 如果图$G=(V,E)$中所有边的权$w$都是非负的,则执行$|V|$次Dijkstra算法即可。
881- - 如果存在负权,则重新设定一个权值权值函数 $\hat{w}$,满足:路径$p$是加权函数$w$从$u$到$v$的一条最短路径,当且仅当$p$也是加权函数$\hat{w}$从$u$到$v$的一条最短路径;加权函数$\hat{w}$的值永远非负。
894+ - 如果存在负权,则重新设定一个权值函数 $\hat{w}$,满足:路径$p$是加权函数$w$从$u$到$v$的一条最短路径,当且仅当$p$也是加权函数$\hat{w}$从$u$到$v$的一条最短路径;加权函数$\hat{w}$的值永远非负。
882895 - 构造方式:
883896 1. 构造新图$G'=(V',E')$,其中$V'=V\cup\\{s\\}$,$E'=E\cup\\{(s,v):v\in V\\}$。即添加一个超级源点$s$,连接所有其他顶点。且扩展原有加权函数$w$,使得$w(s,v)=0,v\in V$。
884- 2. 设函数$h(v)=\delta(s,v)$,易知 $h(v)\le h(u)+w(u,v)$,定义新权$\hat{w}(u,v)=w(u,v)+h(u)-h(v)$。注意$u\in V'$。
897+ 2. 设函数$h(v)=\delta(s,v)$,即先计算出超级源点到其他点的最短路,由三角不等式易知 $h(v)\le h(u)+w(u,v)$,定义新权$\hat{w}(u,v)=w(u,v)+h(u)-h(v)$。注意$u\in V'$。
885898 - 构造正确性的证明思路:
886899 - 新权$\hat{w}(u,v)$的非负性很显然(带入$h$的定义,结合三角不等式)
887900 - $w,\hat{w}$指示同一条最短路径:带入定义,展开$\hat{w}(p)=\sum_{i=1}^{k}\hat{w}(v_{i-1},v_i)$,可知$\hat{w}(p)=w(p)+h(v_0)-h(v_k)$。$h$是固定值,易知两者取得最短路径确实是当且仅当的。
0 commit comments