单源最短路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单源最短路径相关的知识,希望对你有一定的参考价值。
Floyed ——O(n^3)
通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。——from 知乎
关键是枚举中间点
伪代码:
for k:= 1 to n do for i:= 1 to n do for j:= 1 to n do f[i,j]:=min(f[i,j],f[i,k]+f[k,j]);
巧妙的Floyd优化,删点那一题目——小X的最短路,从删光点开始往前推,每次增加一点,不能照搬Floyd,要分别以他为起点,终点,中转点来一次Floyd,复杂度大概O(N^3)
还能用来判断点的连通性。
Dijkstra ——O(n^2)
不能处理负边权!
图片来自维基百科
思想:
初始化数组为maxlongint; c[i]表示起点到i点的最短距离
从起点开始,直到n-1个点
找离当前点最近的蓝点【包括自己】,把它变白,以此为中转点更新与之相连的蓝点。
模板:
program shortest; var n,i,a,b,m,j,k,s,e:longint; x,y:array[1..100] of longint; che:array[1..100] of Boolean; f:array[1..100,1..100] of real; c:array[1..100] of real; min:real; begin readln(n); for i:= 1 to n do readln(x[i],y[i]); readln(m); fillchar(f,sizeof(f),$5f); for i:= 1 to m do begin readln(a,b); f[a,b]:=sqrt(sqr(x[a]-x[b])+sqr(y[a]-y[b])); f[b,a]:=f[a,b]; end; readln(s,e); for i:= 1 to n do c[i]:=f[s,i]; for i:= 1 to n-1 do begin min:=maxlongint; k:=0; for j:= 1 to n do if che[j]=false then if c[j]<min then begin min:=c[j]; k:=j; end; if k=0 then break; che[j]:=true; for j:= 1 to n do if c[j]>f[k,j]+c[k] then c[j]:=f[k,j]+c[k]; end; writeln(c[e]:0:2); end.
Bellman-Ford——O(NE)
无法处理负权回环
以上是关于单源最短路径的主要内容,如果未能解决你的问题,请参考以下文章