最近做了路徑搜索,看了網(wǎng)上的描述真是晦澀,所以自己就整理下!
圖畫的不太好, :)
綠色的是節(jié)點,紅色的為權(quán)值,箭頭為可通行的標(biāo)志.

現(xiàn)在我們要從 0 節(jié)點 到 12 節(jié)點 找一條最優(yōu)路徑:
首先咱們要解決NODE點存貯的信息(結(jié)構(gòu)):
struct NodeBaseInfo
{
unsigned short nNodeID; //番號
unsigned long nMeasure; //權(quán)值
NodeBaseInfo *pParent; //父節(jié)點
};
我寫了簡單的結(jié)構(gòu)大家可以根據(jù)自己需要定義(定義這個結(jié)構(gòu)是為了更好理解)
下面講的是最主要的了:
DIJKSTAR算法中要定義兩個表:OPEN 和 CLOSE (其實可以看作鏈表)
他的原理就是把沒有遍歷的點放在 OPEN 表中,把從 OPEN表中遍歷到的最短權(quán)值的點放入
CLOSE 表中,當(dāng)插入 CLOSE表中的節(jié)點的番號于我們要的重點時算法結(jié)束;然后按照父節(jié)點(pParent)
向上遞歸就可以得到我們要的最優(yōu)路徑了。
第一步:應(yīng)為 OPEN 和CLOSE表都是空的,把起點(0節(jié)點)插入CLOSE標(biāo)中,它的權(quán)值為0。把起點(0節(jié)點)附近的節(jié)點(因該為可通行的)插入OPEN 表中(最好按權(quán)值從大道小的順序插入,這樣取得最優(yōu)值時,這樣速度就會很快)。(如示例圖)

第2步:從OPEN表中找到權(quán)值最小的節(jié)點,把它插入CLOSE 表中, 把這個節(jié)點的可連通的節(jié)點查入OPEN
表,(如果OPEN表中存在要查入的點,如果要插入的節(jié)點的權(quán)值比已經(jīng)存在的小,就把已經(jīng)查入的權(quán)值該為最小的,如果要插入的節(jié)點的權(quán)值比已經(jīng)存在的大,就忽落它.)
(為了更好的理解我把父節(jié)點也加入了,如示例圖)