Dijkstra-MATLAB

问题: 求第一个顶点到其它顶点的最短路径。

  1. 用excel文件输入a[n,n](n 为顶点个数)存放各边权的邻接矩阵(7x7)
    a[n][n]

行向量 pb 、 index1、 index2 、d 分别用来存放 P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。

//标号顶点顺序、标号顶点索引区别?
//标号顶点索引 index2(i): 存放始点到第i 点最短路径中第i 顶点前一顶点的序号;
其中分量
pb(i)=1,当第i顶点已标号。
pb(i)=0,当第i顶点未标号。

d(i) 存放由始点到第i 点最短通路的值。

//注意顶点的修改能力,是重新画图还是别的。

  1. 代码
clc,clear all
a = xlsread('带权有向图.xlsx','Sheet1','A1:G7');   
cm =a;
a=a+a';                                              %有向图也会做对称矩阵                                           
a(find(a==0))=inf                               %将a=0的数全部替换为无穷大               
pb(1:length(a))=0;	pb(1)=1;               %初始全为0。

% pb(i)=1,当第i顶点已标号。pb(i)=0,当第i顶点,未标号。这里先给1标号。

%当一个点已经求出 到原点 的最短距离时,其下标i对应的pb(i)赋1。标记。

index1=1;                                           %index1:标号顶点顺序。存放存入S集合的顺序。
%S集合存放最短路径经过的顶点
index2=ones(1,length(a));                %存放始点到第i点最短路径中第i顶点前一顶点的序号
%初始为一维数组,长度为length(a)。
d(1:length(a))=inf;d(1)=0;                  %存放由始点到第i点最短路径的值,初始为无穷大。
temp=1;                                             %temp初始为顶点1。
while sum(pb)<length(a)                   %看是否所有的点都标记为P标号
tb=find(pb==0);                                 %找到标号为0的所有点,即找到还没有存入S的顶点
d(tb)=min(d(tb),d(temp)+a(temp,tb));           %计算标号为0的点的最短路,
%或者是从原点直接到这个点,又或者是原点经过r1,间接到达这个点
tmpb=find(d(tb)==min(d(tb)));                      %求d[tb]序列最小值的下标
temp=tb(tmpb(1));
%可能有多条路径同时到达最小值,取其中一个,temp也从原点变为下一个点
pb(temp)=1;                                      %找到最小路径的表对应的pb(i)=1
index1=[index1,temp];                      %存放存入S集合的顺序
temp2=find(d(index1)==d(temp)-a(temp,index1));
%d(index1)(已存入S集合的顶点到始点的距离)等于d(temp)(刚刚存入s集合的顶点)
%到始点最短路径的值)-a(temp,index1)(temp,index1之间的路径)
%得到始点到第i 点最短路径中第i 顶点前一顶点的序号。
index2(temp)=index1(temp2(1));      %记录标号索引
end
d, index1, index2

%%% 开始作图
temp = ['v',int2str(i)];
IDS={'V1','V2','V3','V4','V5','V6','V7'};
 bg=biograph(cm,IDS);
 set(bg.nodes,'shape','circle','color',[1 1 1],'lineColor',[0 0 0]);%圆圈和填充颜色

 set(bg,'layoutType','radial');%布局类型,辐射状的,中心区域的
 bg.showWeights='on';%把权值带上
 set(bg.nodes,'textColor',[0,0,0],'lineWidth',2,'fontsize',9);
 %圆圈里的文本颜色,圆圈线条粗细,圆圈大小
 set(bg,'arrowSize',19,'edgeFontSize',9);%箭头大小,边上文本大小
 get(bg.nodes,'position')
  get(bg.nodes,'ID')

 %手动修改节点位置并重新计算路径。
 dolayout(bg)              %用于给bg一个坐标图位置 
 bg.nodes(1).position=[60,200];
 bg.nodes(2).position=[140,200];
 bg.nodes(3).position=[30,100];
 bg.nodes(4).position=[100,100];
 bg.nodes(5).position=[160,100];
 bg.nodes(6).position=[60,0];
 bg.nodes(7).position=[140,0];              %这里就是把这个图排成等边六边形,好看
 dolayout(bg,'pathsonly',true);               %dolayout(BGobj,“Paths”,PathsOnlyValue)仅控制边路径的计算,将节点保留在其当前位置。
  view(bg);                                             %观察,相当于plot -->绘图指令

输出:
a =

Inf 2 4 1 Inf Inf Inf
2 Inf Inf 3 10 Inf Inf
4 Inf Inf 2 Inf 5 Inf
1 3 2 Inf 2 8 4
Inf 10 Inf 2 Inf Inf 6
Inf Inf 5 8 Inf Inf 1
Inf Inf Inf 4 6 1 Inf

最短通路的值
d =

 0     2     3     1     3     6     5

标号顶点顺序
index1 =

 1     4     2     3     5     7     6

标号顶点索引
index2 =

 1     1     4     1     4     7     4

这个我没懂,是什么
这里多余了,属于画图问题,多出来的东西。
ans =

7×1 cell 数组

{0×0 double}
{0×0 double}
{0×0 double}
{0×0 double}
{0×0 double}
{0×0 double}
{0×0 double}

ans =

7×1 cell 数组

{'V1'}
{'V2'}
{'V3'}
{'V4'}
{'V5'}
{'V6'}
{'V7'}

AC:

结果
绘图尝试:
WA1WA1WA2
WA2

解读结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值