本文实例讲述了PHP实现的迪科斯彻(Dijkstra)最短路径算法。分享给大家供大家参考,具体如下:

一、待解决问题
单源最短路径问题,在给定有向图中求一个顶点(单源顶点)到其他所有顶点的最短路径问题。在下图中,每条边上有一个权值,希望求解A到所有其他顶点(B/C/D/E/F/G)的最短路径。
二、问题分析(最短路径的子结构同样最优性)
如果P(A,G)是从顶点A到G的最短路径,假设D和F是这条路径上的中间点,那么P(D,F)一定时从D到F的最短路径。如果P(D,F)不是D到F的最短路径,那必然存在某一个节点M的另一条D到F的路径可以使P(A,B...M...F,G)比P(A,G)小,自相矛盾。
有了这样的性质,我们可以了解Dijkstra算法。
三、Dijkstra算法
Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),又称为单源最短路径算法,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。 问题描述为设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。 Dijstra算法是运用贪心的策略,从源点开始,不断地通过相联通的点找出到其他点的最短距离。
Dijkstra的贪心应用在他利用(二)中的性质,不断地选取“最近”的节点并试探每个节点的所有可能存在链接,以起始点为中心向外层层扩展,直到扩展到终点为止。对于源点A,逐步扩展,根据dist[j]=min{dist[j],dist[i]+matrix[i][j]}更新与i直接相邻的顶点信息。
算法描述
1)算法思想:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
2)算法步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中与k相邻的各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值为顶点k的距离加上k与u边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
四、算法PHP实现
<?php
class Dijkstra
{
private $G;
public function __construct()
{
//有向图存储
$this->G = array(
array(0,1,2,0,0,0,0),
array(0,0,0,1,2,0,0),
array(0,0,0,0,0,2,0),
array(0,0,0,0,0,1,3),
array(0,0,0,0,0,0,3),
array(0,0,0,0,0,0,1),
array(0,0,0,0,0,0,0),
);
}
public function calculate()
{
// 存储已经选择节点和剩余节点
$U = array(0);
$V = array(1,2,3,4,5,6);
// 存储路径上节点距离源点的最小距离
$d = array();
//初始化图中节点与源点0的最小距离
for($i=1;$i<7;$i++)
{
if($this->G[0][$i]>0)
{
$d[$i] = $this->G[0][$i];
}
else
{
$d[$i] = 1000000;
}
}
// n-1次循环完成转移节点任务
for($l=0;$l<6;$l++)
{
// 查找剩余节点中距离源点最近的节点v
$current_min = 100000;
$current_min_v = 0;
foreach($V as $k=>$v)
{
if($d[$v] < $current_min)
{
$current_min = $d[$v];
$current_min_v = $v;
}
}
//从V中更新顶点到U中
array_push($U,$current_min_v);
array_splice($V,array_search($current_min_v,$V),1);
//更新
foreach($V as $k=>$u)
{
if($this->G[$current_min_v][$u]!=0&&$d[$u]>$d[$current_min_v]+$this->G[$current_min_v][$u])
{
$d[$u] = $d[$current_min_v]+$this->G[$current_min_v][$u];
}
}
}
foreach($d as $k => $u)
{
echo $k.'=>'.$u.'<br>';
}
}
}
?>
调用类:
$D = new Dijkstra; $D->calculate();
执行结果:
1=>1 2=>2 3=>2 4=>3 5=>3 6=>4
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》及《php查找技巧与方法总结》
希望本文所述对大家PHP程序设计有所帮助。
# PHP
# 迪科斯彻
# Dijkstra
# 最短路径
# 算法
# PHP机器学习库php-ml的简单测试和使用方法
# PHP实现图的邻接矩阵表示及几种简单遍历算法分析
# PHP对称加密算法(DES/AES)类的实现代码
# PHP基于回溯算法解决n皇后问题的方法示例
# php实现的生成迷宫与迷宫寻址算法完整实例
# PHP实现的贪婪算法实例
# 利用PHP实现开心消消乐的算法示例
# PHP使用栈解决约瑟夫环问题算法示例
# PHP基于递归实现的约瑟夫环算法示例
# PHP实现机器学习之朴素贝叶斯算法详解
# 最短
# 源点
# 图中
# 是从
# 是一个
# 求出
# 到此
# 程序设计
# 值为
# 边上
# 点为
# 是在
# 都有
# 在他
# 相关内容
# 迪科
# 自相矛盾
# 感兴趣
# 我们可以
# 数据结构
相关文章:
如何用腾讯建站主机快速创建免费网站?
如何用搬瓦工VPS快速搭建个人网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
Android使用GridView实现日历的简单功能
宝塔面板创建网站无法访问?如何快速排查修复?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
建站之星北京办公室:智能建站系统与小程序生成方案解析
建站之星如何通过成品分离优化网站效率?
建站之星代理如何优化在线客服效率?
北京网站制作公司哪家好一点,北京租房网站有哪些?
C#如何使用XPathNavigator高效查询XML
如何在阿里云服务器自主搭建网站?
网站按钮制作软件,如何实现网页中按钮的自动点击?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
c# 服务器GC和工作站GC的区别和设置
重庆市网站制作公司,重庆招聘网站哪个好?
香港服务器租用每月最低只需15元?
建站之星免费版是否永久可用?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何通过IIS搭建网站并配置访问权限?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
深圳网站制作培训,深圳哪些招聘网站比较好?
,网站推广常用方法?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速搭建高效WAP手机网站?
如何通过建站之星自助学习解决操作问题?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
黑客入侵网站服务器的常见手法有哪些?
太平洋网站制作公司,网络用语太平洋是什么意思?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
制作销售网站教学视频,销售网站有哪些?
定制建站价位费用解析与套餐推荐全攻略
如何通过西部数码建站助手快速创建专业网站?
油猴 教程,油猴搜脚本为什么会网页无法显示?
北京的网站制作公司有哪些,哪个视频网站最好?
建站之星logo尺寸如何设置最合适?
如何通过商城自助建站源码实现零基础高效建站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
北京网站制作的公司有哪些,北京白云观官方网站?
制作网站的软件免费下载,免费制作app哪个平台好?
音乐网站服务器如何优化API响应速度?
建站主机CVM配置优化、SEO策略与性能提升指南
如何快速搭建高效服务器建站系统?
如何设置并定期更换建站之星安全管理员密码?
如何通过wdcp面板快速创建网站?
如何实现建站之星域名转发设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。