具體參考《演算法**》這本書第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.計算最終路徑 以下圖為例...