问题: 求第一个顶点到其它顶点的最短路径。
- 用excel文件输入a[n,n](n 为顶点个数)存放各边权的邻接矩阵(7x7)
行向量 pb 、 index1、 index2 、d 分别用来存放 P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。
//标号顶点顺序、标号顶点索引区别?
//标号顶点索引 index2(i): 存放始点到第i 点最短路径中第i 顶点前一顶点的序号;
其中分量
pb(i)=1,当第i顶点已标号。
pb(i)=0,当第i顶点未标号。
d(i) 存放由始点到第i 点最短通路的值。
//注意顶点的修改能力,是重新画图还是别的。
- 代码
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:
绘图尝试:
WA1WA2
解读结果: