码迷,mamicode.com
首页 > 其他好文 > 详细

单源最短路径

时间:2017-02-11 00:56:04      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:style   复杂度   数组   get   animation   common   end   das   min   

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)

无法处理负权回环

 

单源最短路径

标签:style   复杂度   数组   get   animation   common   end   das   min   

原文地址:http://www.cnblogs.com/tonylim/p/6388405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!