题目: PHP 实现最短路径的Dijkstra算法
描述:
class DijkstraSP{
const INFINITY_NUMBER=9999999999999;
private $_distTo;
private $_edgeTo;
private $_minPq;
public function __construct($graph,$startPoint){
$graphTotalPointNum=$graph->totalPointNum();
for ($i=0; $i < $graphTotalPointNum; $i++) {
$this->_distTo[$i]=self::INFINITY_NUMBER;
}
$this->_minPq=new minPq();
$this->_distTo[$startPoint]=0;
$this->_edgeTo[$startPoint]=null;
$this->_minPq->insert($startPoint,0);
while(!$this->_minPq->isEmpty()){
$nextRelaxPoint=$this->_minPq->extract();
$this->relax($nextRelaxPoint);
}
}
public function relax($point){
$pointEdges=$this->_graph->pointEdge();
foreach ($pointEdges as $_edge) {
$_edgeWeight=$_edge->weight();
$_edgeToPoint=$_edge->to();
$_edgeFromPointDist=$this->_distTo[$point];
$_edgeToPointDist=$this->_distTo[$_edgeToPoint];
if($_edgeToPointDist> $_edgeFromPointDist+$_edgeWeight){
$this->_edgeTo[$_edgeToPoint]=$_edge;
$this->_distTo[$_edgeToPoint]=$_edgeFromPointDist+$_edgeWeight;
if($this->_minPq->isContain($_edgeToPoint)){
$this->$_minPq[$_edgeToPoint,$this->_distTo[$_edgeToPoint]];
}else{
$this->$_minPq->insert($_edgeToPoint,$this->_distTo[$_edgeToPoint])
}
}
}
}
}
class minPq extends \SplPriorityQueue{
private $_allValue=[];
public function compare($priority1 ,$priority2 ){
if($priority1<$priority2){
return 1;
}elseif($priority1>$priority2){
return -1;
}else{
return 0;
}
}
public function insert ($value ,$priority ){
$this->_allValue[]=$value;
parent::insert($value,$priority);
}
public function contain($value){
return in_array($value,$this->allValue);
}
}