做乙個醫學專案,當中在病例評分時會用到單源最短路徑的演算法。單源最短路徑的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 簡...