基于点割集的最短路径算法程序(核心代码)

SIT数院分队 2019-04-15 06:05:52
一、算法程序1:经典Dijkstra算法(matlab 实现) function [ dist, index1, index2 ] = dij( a ) %两点间最短路的Dijkstra算法 % a 表示图的权值矩阵 % dist 表示所求最短路的权和 % index1 表示标号顶点顺序 % index2 表示标号顶点索引 %参数初始化 M=max(max(a)); pb(1:length(a))=0; pb(1)=1; index1=1; index2=ones(1,length(a)); dist(1:length(a))=M;dist(1)=0;temp=1; %更新l(v),同时记录顶点顺序和顶点索引 while sum(pb)<length(a) tb=find(pb==0); dist(tb)=min(dist(tb),dist(temp)+a(temp,tb)); %更新l(v) tmpb=find(dist(tb)==min(dist(tb))); temp=tb(tmpb(1)); pb(temp)=1; index1=[index1,temp]; %记录标号顺序 index=index1(find(dist(index1)==dist(temp)-a(temp,index1))); if length(index)>=2 index=index(1); end index2(temp)=index; %记录标号索引 end dist index1 index2 end 二、算法程序2:最短路径绘图(matlab实现) %有向图寻找最短路径 %不一定经过所有点 W=[3 4 2 4 4 4 6 6 4 4 5 2 2 3 4 3 6 4 4 2 3 7 3];%边的权重 DG = sparse([1 1 2 2 3 3 4 4 5 6 6 6 7 8 9 10 10 11 12 12 12 13 14],[2 3 3 4 7 8 7 5 6 7 11 10 9 9 10 11 12 12 13 14 15 15 15],W,15,15) %边权重所对应的结点 %要根据实际情况改变最后两位数,代表矩阵维数 h=view(biograph(DG,[],'ShowWeights','on'))%作图 [dist,path1,pred] = graphshortestpath(DG,1,12) [dist,path2,pred] = graphshortestpath(DG,11,12) %调用函数,dist为最短路径长度 %path为经过的结点 set(h.Nodes(path1),'Color',[1 0.4 0.4])%设置结点颜色 edges1=getedgesbynodeid(h,get(h.Nodes(path1),'ID')); set(edges1,'LineColor',[1 0 0])%设置边颜色 set(edges1,'LineWidth',1.5)%设置边线粗度 set(h.Nodes(path2),'Color',[1 0.2 0.2])%设置结点颜色 edges2=getedgesbynodeid(h,get(h.Nodes(path2),'ID')); set(edges2,'LineColor',[0 0 0])%设置边颜色 set(edges2,'LineWidth',1.5)%设置边线粗度 %无向图寻找最短路径 UG = tril(DG + DG')%化为下三角矩阵形式处理 h = view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))%作图 [dist,path1,pred] = graphshortestpath(UG,1,12,'directed',false)%调用函数求相应值 [dist,path2,pred] = graphshortestpath(UG,11,12,'directed',false)%调用函数求相应值 set(h.Nodes(path1),'Color',[1,0.4,0.4])%设置颜色 fowEdges1 = getedgesbynodeid(h,get(h.Nodes(path1),'ID')); revEdges1 = getedgesbynodeid(h,get(h.Nodes(fliplr(path1)),'ID')); edges1 = [fowEdges1;revEdges1]; set(edges1,'LineColor',[1 0 0]) set(edges1,'LineWidth',1.5) set(h.Nodes(path2),'Color',[0,0.7,0.7])%设置颜色 fowEdges2 = getedgesbynodeid(h,get(h.Nodes(path2),'ID')); revEdges2 = getedgesbynodeid(h,get(h.Nodes(fliplr(path2)),'ID')); edges2 = [fowEdges2;revEdges2]; set(edges2,'LineColor',[0 0.7 0.7]) set(edges2,'LineWidth',1.5) 三、点割集搜寻算法 四、基于割点的Dijkstra算法(C语言实现) 五、基于点割集的Dijkstra算法(C语言实现) 目前更新算法一与算法二,我们会不断更新该文内容,对后续算法三、四、五进行补充说明。
...全文
92 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧