dijkstra算法

来源:互联网 发布:适用于mac的杀毒软件 编辑:程序博客网 时间:2024/05/22 13:44
<?
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); 
?>
0 0
原创粉丝点击