單源最短路徑(dijkstra演算法)php實現

2021-09-09 04:16:58 字數 1308 閱讀 7103

做乙個醫學專案,當中在病例評分時會用到單源最短路徑的演算法。單源最短路徑的dijkstra演算法的思路例如以下:

如果存在一條從i到j的最短路徑(vi.....vk,vj),vk是vj前面的一頂點。那麼(vi...vk)也必然是從i到k的最短路徑。dijkstra是以最短路徑長度遞增,逐次生成最短路徑的演算法。比如:對於源頂點v0,首先選擇其直接相鄰的頂點中長度最短的頂點vi,那麼當前已知可得從v0到達vj頂點的最短距離dist[j]=min。如果g=,源點為v0,u=表示已經標記過的頂點集合,dist[i]記錄v0到i的最短距離,cost[i][j]表示邊i到j的開銷。   

1.從v-u中選擇使dist[i]值最小的頂點i,將i增加到u中;

2.更新與i直接相鄰頂點的dist值。(dist[j]=min)

3.知道u=v,停止。

利用php特有的性質,其**例如以下:

function dijkstra()

foreach($node_info['next_node'] as $key=>$next_node)

$i_dist[$node_info['node_id']]='inf'; //初始化為無窮大

$b_mark[$node_info['node_id']]=false; //初始化未增加

} if($start_node_id===false)

//計算初始結點到各節點的最短路徑

$i_dist[$start_node_id]=0; //初始點到其本身的距離為0

$b_mark[$start_node_id]=true; //初始點增加集合

$current_node_id=$start_node_id; //近期增加的節點id

$node_count=count($node_info_arr);

for($i=0;$i

}} foreach($i_dist as $key=>$val)

}} if($min=='inf')

$current_node_id=$candidate_node_id;

$b_mark[$current_node_id]=true;

} foreach($i_dist as $key=>$val)

}

當中樣例為圖:

執行結果為:

0=>0:0

0=>4:10

0=>3:60

0=>2:30

0=>1:70

**:» 

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra單源最短路徑

dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...