<?
function dijkstra($StartId,$EndId){
$node_info_arr=array( //结点的邻接表结构
array(
'node_id'=>0, //某个结点的id
'next_node'=>array(4,1,2),
'node_type'=>1,
'cost'=>array(3,6,4)
),
array(
'node_id'=>4, //某个结点的id
'next_node'=>array(0,3),
'node_type'=>1,
'cost'=>array(2,8)
),
array(
'node_id'=>3, //某个结点的id
'next_node'=>array(1,2,4),
'node_type'=>1,
'cost'=>array(7,9,5)
),
array(
'node_id'=>2, //某个结点的id
'next_node'=>array(3,1),
'node_type'=>1,
'cost'=>array(4,6)
),
array(
'node_id'=>1, //某个结点的id
'next_node'=>array(0,2,3),
'node_type'=>1,
'cost'=>array(1,4,3)
)
);
$start_node_id=$StartId; //起始结点id
$end_node_id=$EndId; //终止结点id
$i_cost=array(array()); //两个节点之间的开销
$i_dist=array(); //起始点到各点的最短距离
$b_mark=array(); //是否加入了
$x_path=array(); //起始点到各点的最短路径
$y_path=''; //起始点到终点的最短路径和起始点到终点相邻点的最短路径
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; //初始化未加入
$x_path[$node_info['node_id']]='INF'; //初始化未加入
}
if($start_node_id===false || $end_node_id===false){
echo '302';
}
//计算初始结点到各节点的最短路径
$i_dist[$start_node_id]=0; //初始点到其本身的距离为0
$b_mark[$start_node_id]=true; //初始点加入集合
$x_path[$start_node_id]=$start_node_id; //初始点到其本身的距离
//$y_path[$start_node_id]='';
$current_node_id=$start_node_id; //最近加入的节点id
$node_count=count($node_info_arr);
for($i=0;$i<$node_count;$i++){
//$current_node_id=1;
//echo $current_node_id;
$path='';
$min='INF'; //当前节点的最近距离
$path='';
if(is_array($i_cost[$current_node_id])){
foreach($i_cost[$current_node_id] as $key=>$val){
if($key!=$start_node_id && ($i_dist[$key]=='INF'||$i_dist[$key]>$i_dist[$current_node_id]+$val)){
$i_dist[$key]=$i_dist[$current_node_id]+$val;
$x_path[$key]=$x_path[$current_node_id].'->'.$key;
}
if($key==$end_node_id){
$y_path=$y_path.$x_path[$current_node_id].'->'.$key.'|';
}
}
}
//print_r($x_path);
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;
//echo '-'.$current_node_id;
//print_r($i_dist);
// print_r($b_mark);
}
foreach($i_dist as $key=>$val){
echo $start_node_id.'=>'.$key.':'.$val.'<br />';
}
print_r($x_path);
echo $y_path;
}
dijkstra(0,2);
?>
function dijkstra($StartId,$EndId){
$node_info_arr=array( //结点的邻接表结构
array(
'node_id'=>0, //某个结点的id
'next_node'=>array(4,1,2),
'node_type'=>1,
'cost'=>array(3,6,4)
),
array(
'node_id'=>4, //某个结点的id
'next_node'=>array(0,3),
'node_type'=>1,
'cost'=>array(2,8)
),
array(
'node_id'=>3, //某个结点的id
'next_node'=>array(1,2,4),
'node_type'=>1,
'cost'=>array(7,9,5)
),
array(
'node_id'=>2, //某个结点的id
'next_node'=>array(3,1),
'node_type'=>1,
'cost'=>array(4,6)
),
array(
'node_id'=>1, //某个结点的id
'next_node'=>array(0,2,3),
'node_type'=>1,
'cost'=>array(1,4,3)
)
);
$start_node_id=$StartId; //起始结点id
$end_node_id=$EndId; //终止结点id
$i_cost=array(array()); //两个节点之间的开销
$i_dist=array(); //起始点到各点的最短距离
$b_mark=array(); //是否加入了
$x_path=array(); //起始点到各点的最短路径
$y_path=''; //起始点到终点的最短路径和起始点到终点相邻点的最短路径
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; //初始化未加入
$x_path[$node_info['node_id']]='INF'; //初始化未加入
}
if($start_node_id===false || $end_node_id===false){
echo '302';
}
//计算初始结点到各节点的最短路径
$i_dist[$start_node_id]=0; //初始点到其本身的距离为0
$b_mark[$start_node_id]=true; //初始点加入集合
$x_path[$start_node_id]=$start_node_id; //初始点到其本身的距离
//$y_path[$start_node_id]='';
$current_node_id=$start_node_id; //最近加入的节点id
$node_count=count($node_info_arr);
for($i=0;$i<$node_count;$i++){
//$current_node_id=1;
//echo $current_node_id;
$path='';
$min='INF'; //当前节点的最近距离
$path='';
if(is_array($i_cost[$current_node_id])){
foreach($i_cost[$current_node_id] as $key=>$val){
if($key!=$start_node_id && ($i_dist[$key]=='INF'||$i_dist[$key]>$i_dist[$current_node_id]+$val)){
$i_dist[$key]=$i_dist[$current_node_id]+$val;
$x_path[$key]=$x_path[$current_node_id].'->'.$key;
}
if($key==$end_node_id){
$y_path=$y_path.$x_path[$current_node_id].'->'.$key.'|';
}
}
}
//print_r($x_path);
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;
//echo '-'.$current_node_id;
//print_r($i_dist);
// print_r($b_mark);
}
foreach($i_dist as $key=>$val){
echo $start_node_id.'=>'.$key.':'.$val.'<br />';
}
print_r($x_path);
echo $y_path;
}
dijkstra(0,2);
?>