图与网络(未完成)

本文介绍迪克斯特拉算法实现过程,通过具体实例演示如何寻找图中两点间最短路径,并对比Floyd算法,阐述不同场景下算法的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个指定顶点之间的最短路径

迪克斯特拉(Dijkstra)算法:思想是按距u从近到远的顺序,依次的求得u到G的各顶点的最短路和距离,直至v。(或直至G的所有顶点),。为避免重复并保留每一步的计算信息,采用了标号算法。

eg:对于六个城市,之间的距离权重价格用矩阵的形式记录下来了,求第一个城市到其他城市间的票价最便宜的路线图

%行向量pb,index1,index2,d分别存放P标号信息,标号定点顺序,标号顶点索引,最短通路的值。
pb=1表示已经标注,完成对这个顶点的最短路径寻找
d(i)存放始点到第i点最短通路的值。
index2(i)存放到第i点最短通路中第i定点前一顶点的序号;


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));
d(1:length(a))=inf;d(1)=0;temp=1;  %数据初始化
while sum(pb)<length(a)  %直到顶点都标注了,结束
    tb=find(pb==0);      
    d(tb)=min(d(tb),d(temp)+a(temp,tb)); %得到矩阵是temp=1到顶点的最短距离
    tmpb=find(d(tb)==min(d(tb)));  %对于上一步而言没有变化的
    temp =tb (tmpb(1));   %temp是没有变化的第一个点
    pb(temp)=1;   %temp这个点完成标记
    index1=[index1,temp];  %记下了这次循环到那个点的距离最短
    temp2=find(d(index1)==d(temp)-a(temp,index1));
    index2(temp)=index1(temp2(1));
end
d,index1,index2

当求每对顶点之间的最短路径时,我们当然可以还用上述的Dijkstra算法,在套一个循环,以不同的定点为起点,但此时的时间按复杂度为O(n^3),第二种方法是Floyd算法其思想是:递推产生一个矩阵A0,A1,A2,,,,,Ak,,,,,An,其中Ak(i,j)表示从顶点Vi到顶点Vj的路径上所经过的顶点序号不大于k的最短路径长度。

计算时的递推公式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值