做一个医学项目,其中在病例评分时会用到单源最短路径的算法。单源最短路径的dijkstra算法的思路如下:

如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点。那么(Vi...Vk)也必定是从i到k的最短路径。Dijkstra是以最短路径长度递增,逐次生成最短路径的算法。例如:对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+cost[i][j]}。假设G=,源点为V0,U={V0}表示已经标记过的顶点集合,dist[i]记录V0到i的最短距离,cost[i][j]表示边i到j的开销。

1.从V-U中选择使dist[i]值最小的顶点i,将i加入到U中;

2.更新与i直接相邻顶点的dist值。(dist[j]=min{dist[j],dist[i]+cost[i][j]})

3.知道U=V,停止。

利用php特有的性质,其代码如下:function dijkstra(){

$node_info_arr=array(//结点的邻接表结构

array(

'node_id'=>0,//某个结点的id

'next_node'=>array(4,2,1),

'node_type'=>0,

'cost'=>array(10,30,100)

),

array(

'node_id'=>4,//某个结点的id

'next_node'=>array(3),

'node_type'=>1,

'cost'=>array(50)

),

array(

'node_id'=>3,//某个结点的id

'next_node'=>array(1),

'node_type'=>1,

'cost'=>array(10)

),

array(

'node_id'=>2,//某个结点的id

'next_node'=>array(3,1),

'node_type'=>1,

'cost'=>array(60,60)

),

array(

'node_id'=>1,//某个结点的id

'next_node'=>array(),

'node_type'=>2,

'cost'=>array()

)

);

$start_node_id=false;//起始结点id

$i_cost=array(array());//两个节点之间的开销

$i_dist=array();//起始点到各点的最短距离

$b_mark=array();//是否加入了

foreach($node_info_arr as &$node_info){

if($node_info['node_type']==0){

$start_node_id=$node_info['node_id'];//找到初始节点

}

foreach($node_info['next_node'] as $key=>$next_node){

$i_cost[$node_info['node_id']][$next_node]=$node_info['cost'][$key];

}

$i_dist[$node_info['node_id']]='INF';//初始化为无穷大

$b_mark[$node_info['node_id']]=false;//初始化未加入

}

if($start_node_id===false){

return '302';

}

//计算初始结点到各节点的最短路径

$i_dist[$start_node_id]=0;//初始点到其本身的距离为0

$b_mark[$start_node_id]=true;//初始点加入集合

$current_node_id=$start_node_id;//最近加入的节点id

$node_count=count($node_info_arr);

for($i=0;$i

$min='INF';//当前节点的最近距离

if(is_array($i_cost[$current_node_id])){

foreach($i_cost[$current_node_id] as $key=>$val){

if($i_dist[$key]=='INF'||$i_dist[$key]>$i_dist[$current_node_id]+$val){

$i_dist[$key]=$i_dist[$current_node_id]+$val;

}

}

}

foreach($i_dist as $key=>$val){

if(!$b_mark[$key]){

if($val!='INF'&&($min=='INF'||$min>$val)){

$min=$val;

$candidate_node_id=$key;//候选最近结点id

}

}

}

if($min=='INF'){

break;

}

$current_node_id=$candidate_node_id;

$b_mark[$current_node_id]=true;

}

foreach($i_dist as $key=>$val){

echo $start_node_id.'=>'.$key.':'.$val.'
';

}

}

其中例子为图:

运行结果为:

0=>0:00=>4:100=>3:600=>2:300=>1:70

dijkstra算法PHP,单源最短路径(dijkstra算法)php实现相关推荐

  1. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

  2. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  3. Dijkstra算法求单源最短路径

    1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶 ...

  4. Dijkstra(迪杰斯特拉)算法求单源最短路径问题

    Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...

  5. 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)

    [Bellman-Ford算法] [算法]Bellman-Ford算法(单源最短路径问题)(判断负圈) 结构: #define MAX_V 10000 #define MAX_E 50000 int ...

  6. 图的基本算法(单源最短路径)

    在许多路由问题中,寻找图中一个顶点到另一个顶点的最短路径或最小带权路径是非常重要的提炼过程.正式表述为,给定一个带权有向图G = (V, E) , 顶点s到v中顶点t的最短路径为在边集E中连接s到t代 ...

  7. 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法

    原文地址:http://www.wutianqi.com/?p=1912 相关文章: 1.Dijkstra算法: http://www.wutianqi.com/?p=1890 2.Floyd算法: ...

  8. 贪心算法解决单源最短路径问题

    参考教材:算法设计与分析(第3版) 王晓东 编著 清华大学出版社 贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的基 ...

  9. c语言单元最短路径贪心算法,单源最短路径 贪心算法

    <单源最短路径 贪心算法>由会员分享,可在线阅读,更多相关<单源最短路径 贪心算法(3页珍藏版)>请在人人文库网上搜索. 1.实验三 单源最短路径一.实验目的及要求掌握贪心算法 ...

最新文章

  1. mysql数据库字符集设置
  2. wxPython的API下载
  3. python培训费用-Python培训费用得多少?
  4. 机房速度和带宽测试的简单方法
  5. 进入正在运行的Docker容器的4种方式
  6. springboot文档笔记
  7. 听说,阿里“拆中台”了?
  8. SimpleDateFormat类 java 1614697530
  9. [Angualr 2] Using FormBuilder
  10. KMP模式匹配算法程序(Python,C++,C)
  11. R语言︱情感分析—词典型代码实践(最基础)(一)
  12. Vue3+ts+vite 国际化处理
  13. 高等数学中▽符号的作用
  14. 基于Android studio+SSH的单词记忆(背单词)APP设计
  15. N95滤材之父:滤材才是关键!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
  16. VR全景云展厅,实现7*24小时的线上宣传能力!
  17. _snprintf_s与_snprintf
  18. 实现VS平台账号注册机
  19. 有几种水果不能空腹吃,你知道吗?
  20. Linux C/TCP多线程网络聊天室

热门文章

  1. 学编程面试通不过_我从编程面试中学到了什么
  2. mysql管理应用_如何在PHP和MySQL中制作出色的库存管理应用程序
  3. ipython和anaconda区别_anaconda和python区别
  4. Mac OS下使用VS Code对C++程序进行debug的配置
  5. 安装低版本的R语言、和自行下载安装各个版本的R语言包、以及多环境运行R
  6. Python | 常见的反爬及解决方法,值得收藏
  7. python如何操作excel 基础代码
  8. 一文搞清楚 Spark 数据本地化级别
  9. ubuntu16.04中源码安装仅仅支持CPU的TensorFlow
  10. Python实现八皇后问题