当前位置: 首页 > 后端技术 > PHP

编程王5——最短路径

时间:2023-03-30 05:42:20 PHP

首发于范浩博科学院。自如年底将拥有50万套房源。大家都知道,每间房子都需要配置齐全,才能出租给自如客人。租房配置的整个过程是非常复杂的,每天需要大量的物流师傅将家电、家具等物品从仓库运送到每个需要配置的房间。为了在更多的时间内配置更多的房子,我需要不断优化从A仓库到G房间的物流路径或者从B仓库到E房间的距离。请写一个算法,给你任意图中的两个点,计算最短的两点之间的距离。注:ABCDEFGH可能是仓库也可能是房间,点与点之间的距离就是距离。解题思路本题是求解无向图中单个源点的最短路径,常采用Dijkstra算法求解,按路径长度递增的顺序生成最短路径。算法理论Dijkstra算法利用最短路径的最优子结构性质,最优子结构性质描述为:P(i,j)={$v_i$,...,$v_k$,...,$v_s$,$v_j$}是顶点i到j的最短路径,顶点k和s是这条路径上的中间顶点,那么P(k,s)也一定是k到s的最短路径。由于P(i,j)={$v_i$,...,$v_k$,...,$v_s$,$v_j$}是从顶点i到j的最短路径,则P(i,j)=P(i,k)+P(k,s)+P(k,j)。如果P(k,s)不是从顶点k到s的最短路径,则必须存在另一条从顶点k到s的最短路径P'(k,s),所以P'(i,j)=P(i,k)+P'(k,s)+P(k,j)indexMap=array_keys($matrix);$this->len=count($matrix);array_walk($matrix,function(&$value){$value=array_values($value);});$this->indexMatrix=array_values($matrix);$this->startPoint=array_search($startPoint,$this->indexMap);$this->endPoint=array_search($endPoint,$this->indexMap);$this->初始化();}publicfunctioninit(){for($i=0;$i<$this->len;$i++){//初始化距离$this->D[$i]=$this->indexMatrix[$this->startPoint][$i]>0?$this->indexMatrix[$this->startPoint][$i]:MAX;$this->P[$i]=array();//开始化已经找到集合if($i!=$this->startPoint){array_push($this->P[$i],$i);$this->U[$i]=false;}else{$this->U[$i]=true;}}}publicfunctiongetDistance(){return$this->D[$this->endPoint];}publicfunctiongetPath(){$path=$this->P[$this->endPoint];array_unshift($path,$this->startPoint);foreach($pathas&$value){$value=$this->indexMap[$value];}返回$路径;}}Dijkstra算法求解:publicfunctiondijkstra(){for($l=1;$l<$this->len;$l++){$min=MAX;//查找距离源点最近的节点{v}$v=$this->startPoint;对于($i=0;$i<$this->len;$i++){if(!$this->;U[$i]&&$this->D[$i]<$min){$min=$this->D[$i];$v=$i;$this->U[$v]=true;//更新最短路径for($i=0;$i<$this->len;$i++){if(!$this->U[$i]&&($min+$this->indexMatrix[$v][$i]<$this->D[$i])){$this->D[$i]=$min+$this->indexMatrix[$v][$i];$this->P[$i]=array_merge($this->P[$v],数组($i));}}}}接收标准输入处理并输出结果://图$matrix=array('A'=>array('A'=>MAX,'B'=>15,'C'=>6,'D'=>MAX,'E'=>MAX,'F'=>25,'G'=>MAX,'H'=>MAX),'B'=>array('A'=>15,'B'=>MAX,'C'=>9,'D'=>MAX,'E'=>7,'F'=>MAX,'G'=>MAX,'H'=>MAX),'C'=>array('A'=>MAX,'B'=>9,'C'=>MAX,'D'=>11,'E'=>MAX,'F'=>MAX,'G'=>最大,'H'=>最大),'D'=>g吨;array('A'=>MAX,'B'=>MAX,'C'=>11,'D'=>MAX,'E'=>12,'F'=>MAX,'G'=>MAX,'H'=>5),'E'=>array('A'=>MAX,'B'=>7,'C'=>6,'D'=>12,'E'=>MAX,'F'=>5,'G'=>MAX,'H'=>7),'F'=>array('A'=>25,'B'=>MAX,'C'=>6,'D'=>MAX,'E'=>5,'F'=>MAX,'G'=>12,'H'=>MAX),'G'=>array('A'=>MAX,'B'=>MAX,'C'=>MAX,'D'=>MAX,'E'=>MAX,'F'=>12,'G'=>MAX,'H'=>17),'H'=>array('A'=>MAX,'B'=>MAX,'C'=>MAX,'D'=>5,'E'=>7,'F'=>25,'G'=>17,'H'=>MAX),);//CGwhile(!$input=trim(fgets(STDIN),"\t\n\r\0\x0B[]"));$path=newPath($matrix,$input{0},$input{1});$path->dijkstra();echo$path->getDistance(),'',内爆('-',$path->getPath()),PHP_EOL;总结一下,这道题就是求无向图到源点的最短路径,时间复杂度是$O(n^2)$。如果想找到到有向图源点的最短路径,只需要将相邻顶点的反向路径设置为∞即可,即修改初始图的矩阵不得不说,求一对顶点的最短路径的问题,比求单个源点的最短路径要复杂,也可以使用Dijkstra算法以每个顶点为源点来解决,但是有一个更简洁的Floyd算法。相关文章?编程之王1(2017-12-05)编程之王2-水库(2017-12-05)编程之王3-01背包(2017-12-05)编程之王2之四-约瑟夫·林(2017-12-06)