POJ 2449 A 初步 K短路

2021-08-26 10:35:57 字數 1279 閱讀 9042

原以為a*會很難懂~~~結果狐狸大大一口氣就給我講懂了a*和k短路的求法.....

所謂a*就是啟發是搜尋..說白了就是給bfs搜尋乙個順序使得搜尋更加合理減少無謂的搜尋..如何來確定搜尋的順序?..也就是用乙個值來表示這個值為f[x]..每次搜尋取f[x]最小的拓展...那麼這個f[x]=h[x]+g[x]其中這個h[x]就是當前搜尋時的代價..如求k段路這個就是前乙個點的h[x']+邊的長度...而g[x]是乙個估價函式..估價函式要小於是對當前點到目標的代價的估計..這個估計必須小於等於實際值~~否則會出錯...a*的關鍵也就是構造g[x]..

而這裡要說的求k短路一種方法..就是用bfs+a*來搜尋的過程...g[x]的設定為到這個點到目標點的最短路徑...顯然其實小於等於實際值的...h[x]就是搜尋到這個點的代價..用乙個優先佇列來做..每次取出h[x]+g[x]最小的點來拓展...拓展也就是通過這點來更新其能直接經過一條邊到達的點..這裡做好乙個新點就丟進優先佇列裡去..反正總會從對首彈出h[x]+g[x]最小的點..可以想一下...如果當前取出的優先佇列頭是乙個點e並且是第一次取出h..那麼就找到了一條從源點到h的最短路徑..這裡其實很djikstra的感覺差不多..如果第二次在對頭取出了e..則是找到了一條從源點到h的第二短路徑..依次類推..第幾次從對頭彈出e..則找到了從源點到e的第幾短路徑..

那要是本身就不存在k短路呢??那就是e拓展不到k但是其他點很有可能一直打圈圈無限下去...這裡就要用個條件來判斷一下...首先在找某個點作為優先佇列頭出現了幾次就用了乙個計數器times..所求的點times[e]==k就代表得到了解..如果當前想拓展的點times>k就沒必要拓展了..因為這個點已經是求到k+1短路了..從這個點繼續往下搜肯定得到的是大於等於k+1短路的路徑...就像1->2有3條路..2->3有2條路..那1->3有6條路的概念差不多..沒必要對其進行拓展了..

還有一點要特別注意的就是題目要求必須要走..也就是s==e時..k++....

補充說一下stl的priority_queue 也就是stl就已經有乙個優先佇列了..像sort一樣的可以直接使用..

宣告 #include

定義 priority_queue《型別》 變數名

但注意的是若是對結構體用..則需要在結構體中對 < 進行過載...如這道題的struct就應該寫成這樣:

struct node } return ; } int astar() } return -1; } int main() scanf("%d%d%d",&s,&e,&k); if (s==e) k++; djikstra(); printf("%d\n",astar()); return 0; }

poj2449 A 演算法求解k短路

今天想到了以前早就遺留下來的乙個演算法 a 演算法,基本上,我對於a 只有過簡單的了解,卻從來沒有具體的寫過 a 於是就有了今天的a 學習。a 演算法相比與其他的搜尋來說,它多了乙個估價函式而已。而估價函式在不同的題目中形式又不同,這正是a 難的地方啊 對於此題 給出n個點,m條邊,可能又重邊,給定...

POJ2449 A 演算法 第k短路

題意 傳送門 原題目描述在最下面。給你乙個有向圖,求指定節點間的第k短路。先反向跑出從終點開始的到每個節點的最短距離。樂觀估計函式f n g n h n f n g n h n g n g n 表示到當前狀態跑的距離,h n h n 表示到目標狀態還需要的距離。對於a a 然後跑一遍bf s bfs...

POJ 2449 A 演算法與最短路演算法

題目描述 給定乙個帶權有向圖,詢問從起點到終點第k短路徑長度,如果沒有則輸出 1。這個題目資料有特殊之處,就是如果起點與終點重合時,距離0並不算第一短最短路徑。a 演算法 使用估值函式來進行搜尋,f n g n h n 其中f n 表示狀態起點經過狀態n到狀態終點的估值,g n 為狀態起點到狀態n的...