最短路径

余生颓废 提交于 2019-11-28 04:14:10

1:Bellman-Ford 算法

计算复杂度为 NM,只能计算单源,但是可以检测负值回环

操作流程:

1:选取所有边,以该边来进行松弛操作

2:循环n-1次

function [dist, pre]=bellmanford_ShortestPath(w,s)
%% initilization 
n=size(w,1);
dist=ones(1,n)*inf;
pre=zeros(1,n)*NaN;
dist(s)=0;%% 进行松弛操作 进行n-1 次,每次遍历所有边 
for k=1:n-1
    for i=1:n
        for j=1:n
           if dist(j)>dist(i)+w(i,j)
             dist(j)=dist(i)+w(i,j);
             pre(j)=i;
        end
        end
    end
end%% 回环确定
for i=1:n
    for j=1:n
        if w(i,j)~=inf
            
            if (dist(j)>dist(i)+w(i,j))
                error('negetive weight circut')
            end
        end
        
    end

end

  2:Floyd 算法

该算法最简单,但是可以计算多源路径,复杂度为 N*N*N

function  [D,path]=Floyd_ShortestPath(w)

n=size(w,1);
D=w;
path=zeros(n,n);
for k=1:n
    for i=1:n
        for j=1:n
            if D(i,j)>D(i,k)+D(k,j)
             D(i,j)=D(i,k)+D(k,j);
             path(i,j)=k;%% 也可以写作             path(i,j)=D(i,k);
            end
        end
    end
end

end

  Dijkstra算法

较为复杂的一种,计算复杂度为 N*N

操作流程如下:

1:初始化,见所有点分为两个集合 U和S, U为已选取的点,源点属于它,其余 点在S中 

2:选取S中距离源点最近的点V,作为U下一个包含的对象

3:以V作为中间点,跟新所有S中的距离源点的最短路径

4:循环

function [dist]=Dijkstra_ShortestPath(w,s)

n=size(w,1);
dist=ones(1,n)*inf;
final=zeros(1,n);
%% initialization 
dist=w(s,1:n);
final(s)=1;
dist(s)=0;
for i=1:n-1
    min_result=inf;
    index=find(final~=1);
    
    temp=dist(index);
    [ val,index_a]=min(temp);
    
    index_a=index(index_a);
    
    final(index_a)=1;
    
    for i=1:n
        if  ( (final(i) ~=1) && (val+w(index_a,i)<dist(i)))
            dist(i)=val+w(index_a,i);  
        end
    end
    
    
    
    
end

    
end

  

 路经的寻找(回溯法)

 

function print_floyd(path,s,t)
if path(s,t)>0
    print_floyd(path,s,path(s,t));
    print_floyd(path,path(s,t),t);
else 
    fprintf('->%s',num2str(t));
end

 

  

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!