得鹿梦鱼 得鹿梦鱼

最短路径算法

最短路径问题:给定有向图G=V,SAG = V, SA用n表示图G的顶点数n = V,用m表示图中的边数m = A,选中图中的一个顶点为源点s,对每条有向边i,j inAi,j \ in A,给其一个权重值cijc_{ij}

  • 从顶点s到顶点i的非空路径P是一个有向边序列:s,j1,j1,j2,,jn,is, j_1, j_1, j_2,\dots, j_n,i,路径也表示为sj1j2is \rightarrow j_1 \rightarrow j_2 \rightarrow \dots \rightarrow i

cPcP表示路径P中的所有权重之和
didi表示所有sis\rightarrow i路径权重之和的最下值,则称路径为最短路径,若图中不存在sis\rightarrow i的路径,则置didi\infty

  • 若路径中没有重复的顶点,则称为简单路径
  • 若路径起止于同一个顶点,则称之为回路

无负权边 Dijkstra算法

当所有边i,jAi,j \in A都有cij>0c_{ij} > 0,可用dijkstra算法来求解最短路径

该算法对图中顶点保存一个距离标记d,did_i是最短sis \rightarrow i路径的距离预估数值,称为sis \rightarrow i路径的距离

伪代码

输入:G = V,A, ijA,cij0,sA\forall_{ij \in A}, c_{ij} \geq 0, s \in A
输出didipi,iApi, \forall_i \in A

for all iVi \in V do di,pinulldi \leftarrow \infty, pi \leftarrow null
ds0ds \leftarrow 0
while所有顶点没有被标注完 do
\quad在所有未标注的点选择i,使得didi最小,并标注i
\quadfor jAj \in A && i,jAi,j \in A do
\quad\quadif dj>di+cijdj > di + c_{ij}
dj=di+cij\quad\quad\quad dj = di + c_{ij}
pji\quad\quad\quad pj \leftarrow i

有负权边 Bellman-ford算法

负权回路的检测算法