单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法。单源最短路径的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=<V, E>,源点为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<$node_count;$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.'<br />';
}
}

执行结果为:
0=>0:0
0=>4:10
0=>3:60
0=>2:30
0=>1:70
单源最短路径(dijkstra算法)php实现的更多相关文章
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 单源最短路径——dijkstra算法
dijkstra算法与prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...
- 单源最短路径 dijkstra算法实现
本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图.而且连通,有向图,不连通图的做法相似. 算法简述: 首先确定"单源"的源.假设是第0个顶点. 维护三个数组 ...
- 单源最短路径——Dijkstra算法学习
每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...
- 单源最短路径-Dijkstra算法
1.算法标签 贪心 2.算法描述 具体的算法描述网上有好多,我觉得莫过于直接wiki,只说明一些我之前比较迷惑的. 对于Dijkstra算法,最重要的是维护以下几个数据结构: 顶点集合S : 表示已经 ...
- [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)
单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...
- matlab练习程序(单源最短路径Dijkstra)
图的相关算法也算是自己的一个软肋了,当年没选修图论也是一大遗憾. 图像处理中,也有使用图论算法作为基础的相关算法,比如图割,这个算法就需要求最大流.最小割.所以熟悉一下图论算法对于图像处理还是很有帮助 ...
- 单源最短路径---Bellman-Ford算法
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.Dijkstra算法的局限性 像上图,如果用dijkstra算法的话就会出错,因为如果从1开始,第一步dist[2] = ...
- 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)
首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...
- 单源最短路径Dijkstra和优先级算法
百度百科:迪杰斯特拉算法. 代码实现如下: import java.util.Comparator; import java.util.PriorityQueue; import java.util. ...
随机推荐
- ASP.NET 中的返回按钮的实现【转】
返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加 的一个东东,一般这种功能的实现在ASP.net中都 ...
- C++标准库<string>简单总结
C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...
- git some cookies
*首先得配置和本地的操作实际上都很简单,忽略了:*git 添加远程仓库 git remote add 仓库名 url:*先pull下来,语法 git pull 远程仓库名 远程分支名[:当地分支名], ...
- FileUpload 简单上传+小预览
页面代码 : <form id="form1" runat="server"> <div> <asp:FileUpload ID= ...
- ASP.net关于C#代码与javaScript函数的相互调用
C#代码与javaScript函数的相互调用 问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在 ...
- [php基础]记录PHP错误日志 display_errors与log_errors的区别
display_errors 错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利.推荐关闭此选项. display ...
- Oracle 11g随Redhat 5系统自动启动与关闭的设置方法
最近,ORACLE系统基本调试通过,是时候设置ORACLE随RHEL自动启动与关闭服务的时候了,之所以把这个任务放在最后来做,是因为我觉得这个应该不会很难,但真正实施起来,还是遇到了个不小的障碍:写好 ...
- Spring4.0学习笔记(1) —— 基础知识
1.基本定义 IOC: 其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了 IOC之后,容器主动将资源推送给它所管理的组件,组件索要做 ...
- [转] JS运算符 &&和|| 及其优先级
第一.&& (逻辑与)运算,看一个简单的例子: var a = 1 && 2 && 3; var b = 0 && 1 &&am ...
- 【PHP】新浪、淘宝的地区 API调用
/推荐使用新浪的: $ch = curl_init(); $url = "http://ip.dpool.sina.com.cn/iplookup/iplookup.php?format=j ...