• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

迪克斯特拉(Dijkstra)算法php 实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
<?php
class Graph{

    private $data = [];
    const INFINITY = -1;

    public function addDirection( $fromNode, $toNode,$cost ){
        if( !isset($this->data[$fromNode]) ){
            $this->data[$fromNode] = [];
        }
        $this->data[$fromNode][$toNode] = $cost;
    }

    public function getNeighters( $node ){
        return $this->data[$node] ?? [];
    }

    public function printData(){
        print_r( $this->data );
    }

}

class DK{

    public $graph = null;
    private $costs = [];
    private $parents = [];
    public $processedNodes = [];

    public function getGraph() : Graph{
        if( $this->graph == null ){
            $this->graph = new Graph();
        }
        return $this->graph;
    }

    public function printGraph(){
        return $this->getGraph()->printData();
    }

    public function addDirection($fromNode,$toNode,$cost){
        $this->getGraph()->addDirection( $fromNode,$toNode,$cost );
    }

    public function getCosts( $fromNode, $toNode ){
        $this->initCosts( $fromNode, $toNode );
        $node = $this->getLowestNode();
        while ( $node ){
            $cost = $this->getCost( $node );
            foreach ( $this->getGraph()->getNeighters($node) as $neighterNode => $neighterCost ){
                $newCost = $cost + $neighterCost;
                if( $this->costs[$neighterNode] == Graph::INFINITY || !isset($this->costs[$neighterNode]) || $newCost < $cost ){
                    $this->costs[$neighterNode] = $newCost;
                    $this->parents[$neighterNode] = $node;
                }
            }
            array_push($this->processedNodes, $node);
            $node = $this->getLowestNode();
        }
        return $this->costs;
    }

    public function initCosts($fromNode, $toNode){
        $nodes = $this->getGraph()->getNeighters($fromNode);
        foreach ($nodes as $_node => $cost ){
            $this->costs[$_node] = $cost;
        }
        if( !isset( $this->costs[$toNode] ) ){
            $this->costs[$toNode] = Graph::INFINITY;
        }
    }

    public function getCost( $toNode ){
        return $this->costs[$toNode] ?? Graph::INFINITY;
    }

    private function getLowestNode(){
        $lowestNode = null;
        $lowestCost = Graph::INFINITY;
        foreach ( $this->costs as $node =>$cost ){
            if( $cost == Graph::INFINITY || in_array($node, $this->processedNodes) ){
                continue;
            }

            if( $lowestCost == Graph::INFINITY || $cost < $lowestCost ){
                $lowestCost = $cost;
                $lowestNode = $node;
            }
        }
        return $lowestNode;
    }
}

$dk = new DK();
$dk->addDirection('shenyang','liaoyang', 5 );
$dk->addDirection('shenyang', 'anshan', 1);
$dk->addDirection('anshan','dalian',5);
$dk->addDirection('liaoyang','dalian', 2 );
$dk->addDirection('dalian','panjin', 7 );

$dk->printGraph();

var_dump($dk->getCosts('shenyang','panjin'));
?>

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php-fpm日志告警&quot;seem busy&quot;发布时间:2022-07-10
下一篇:
【转】php利用mkdir创建多级目录发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap