matlab实现dijkstra、floyd、kruskal

dijkstra

clc,clear
a=zeros(6); %邻接矩阵初始化
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;
a=a+a';
a(find(a==0))=inf;%不可通置为无穷
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));%pb标记是否访问过,index1用来记录每次找到的到达的最小顶点,index2用来记录对应顶点来自哪个点
d(1:length(a))=inf;d(1)=0;%d用来记录最后要求的结果
temp=1; %最新的P标号的顶点
while sum(pb)<length(a)
   tb=find(pb==0);
   d(tb)=min(d(tb),d(temp)+a(temp,tb));%d[y]=min{d[y],d[x]+w(x,y)}
   tmpb=find(d(tb)==min(d(tb)));
   temp=tb(tmpb(1)); %可能有多个点同时达到最小值,只取其中的一个
   pb(temp)=1;
   index1=[index1,temp];
   temp2=find(d(index1)==d(temp)-a(temp,index1));
   index2(temp)=index1(temp2(1));
end
d, index1, index2

floyd

clear;clc;
n=6; a=zeros(n);
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25; a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25; a(5,6)=55;
a=a+a'; 
a(a==0)=inf; %把所有零元素替换成无穷
a([1:n+1:n^2])=0; %对角线元素替换成零,Matlab中数据是逐列存储的
path=zeros(n);
for k=1:n%如果k放在里面,造成过早的把A到B的最短路径确定下来了
   for i=1:n
      for j=1:n
         if a(i,j)>a(i,k)+a(k,j)
            a(i,j)=a(i,k)+a(k,j);
            path(i,j)=k;
         end 
      end
   end
end
a, path
result=a(1,:)

kruskal

clc;clear;
a=zeros(7);
a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40;
a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;
a(4,7)=42; a(5,6)=70; 
a=a+a';
[i,j,b]=find(a);%find(A)返回矩阵A中非零元素所在位置,[i,j,b]表示i行j列值b不为0
data=[i';j';b'];index=data(1:2,:);%'表示转置放,index表示不为零的所有顶点坐标映射集合(二维)
loop=length(a)-1;
result=[];
while length(result)<loop
   temp=min(data(3,:));%取出所有权值最小的
   flag=find(data(3,:)==temp);%找到他的位置
   flag=flag(1);%取第一个
   v1=index(1,flag);v2=index(2,flag);%取出起点或者终点为它的
   if v1~=v2%如果不是本身到本身(圈)
      result=[result,data(:,flag)];%连接
   end
   index(find(index==v2))=v1;%去
   data(:,flag)=[];
   index(:,flag)=[];
end
result

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/absurd1350/article/details/38716715
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞