单源最短路径

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)

无法处理负权回环

 

以上是关于单源最短路径的主要内容,如果未能解决你的问题,请参考以下文章

单源最短路径Dijkstra算法的思想详细步骤代码

图文解析 Dijkstra单源最短路径算法

单源最短路径

单源最短路径

单源最短路径

单源最短路径 djkstra