找最短路徑演算法 狄克斯特拉演算法 php 實現

2021-10-02 14:04:30 字數 2664 閱讀 3842

具體參考《演算法**》這本書第7章講的,原書是用python寫的,我用php再寫一次,並稍加完善

把書上這三道練習題,拿來測試

網上再找了乙個稍「難」點的題

上**:

class shortpath

//初始化花銷陣列,即:只知道start的鄰居節點的花銷,其它節點都是正無窮

foreach ($this->graph as $k=>$v) elseif(empty($this->costs[$k]))

}$this->costs['finish']=$this->infinity;

}public function find()

}//除錯輸出

echo '當前節點:' .$nodekey . php_eol;

echo '鄰居們:' . php_eol;

print_r($neighbors);

echo '花銷:' . php_eol;

print_r($this->costs);

//既然已處理完了該節點的所有鄰居,那麼將該節點標記為已處理過了

$this->processed=$nodekey;

//找出下乙個待處理的節點

$nodekey=$this->findlowestcostnode();

}$this->showresult();

}//在未處理過的節點中,查詢出最短的那個

protected function findlowestcostnode()

}return $lowestcostkey;

}//美化顯示處理結果

protected function showresult()

echo '最短路徑全長是:' . $this->costs['finish'] . php_eol;

echo '路線是:start->' . implode('->',$path) . php_eol;

}}//對應練習題a

$graph1=[

"start"=>[

"a"=>2,

"b"=>5,

],"a"=>[

"b"=>8,

"d"=>7,

],"b"=>[

"c"=>4,

"d"=>2,

],"c"=>[

"finish"=>3,

"d"=>6

],"d"=>[

"finish"=>1

]];//對應練習題b

$graph2=[

"start"=>[

"a"=>10,

],"a"=>[

"c"=>20,

],"b"=>[

"a"=>1,

],"c"=>[

"b"=>1,

"finish"=>30,

],];//對應練習題c。這裡能看出,該演算法不適用於有負權邊的情況

$graph3=[

"start"=>[

"a"=>2,

"b"=>2,

],"a"=>[

"c"=>2,

"finish"=>2

],"b"=>[

"a"=>2,

],"c"=>[

"b"=>-100,

"finish"=>2,

],];//對應最後一題,將圖中的v0,改為start,v8改為finish

$graph4=[

"start"=>[

"v1"=>1,

"v2"=>5,

],"v1"=>[

"start"=>1,

"v2"=>3,

"v3"=>7,

"v4"=>5,

],"v2"=>[

"start"=>5,

"v1"=>3,

"v4"=>1,

],"v3"=>[

"v1"=>7,

"v2"=>2,

"v6"=>3,

],"v4"=>[

"v1"=>5,

"v2"=>1,

"v3"=>2,

"v5"=>3,

"v6"=>6,

"v7"=>9,

],"v5"=>[

"v2"=>6,

"v4"=>3,

"v7"=>5,

],"v6"=>[

"v3"=>3,

"v4"=>6,

"v7"=>2,

"finish"=>7

],"v7"=>[

"v4"=>9,

"v5"=>5,

"v6"=>2,

"finish"=>4

],];$obj=new shortpath($graph4);

$obj->find();

最後一題的結果輸出展示 

最後附上《演算法**》這本書的pdf版

單源最短路 狄克斯特拉演算法

一般形式的用鄰接矩陣來實現dijkstra效率比較低,我這裡直接記錄的是用鄰接表的方法以及用優先佇列加以應用。首先解釋什麼是dijkstra演算法 dijkstra演算法 dijkstra演算法適用於求單源最短路,即可以求出起點到其餘各點之間的最短路。它的演算法實現是乙個不斷更新的過程。舉乙個最簡單...

單源最短路徑問題(狄克斯特拉演算法)

挑戰程式設計競賽2上的一道例題 p250 include using namespace std static const int max 100 static const int infty 1 21 這裡表示int型別最大值 static const int white 0 表示三種狀態 sta...

狄克斯特拉演算法

廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...