POJ 2449 求第K短路

2022-04-14 15:42:39 字數 1621 閱讀 4659

第一道第k短路的題目 qaq

拿裸的dijkstra + 不斷擴充套件的a* 給2000ms過了

題意:大意是 有n個station 要求從s點到t點 的第k短路 (不過我看題意說的好像是從t到s 可能是出題人寫錯了)

從這題中還真的學到了很多

1.第k短路的演算法 a* 還有用邊表實現dij

(注:以下部份資料**於網上)

所謂a*就是啟發是搜尋 說白了就是給搜尋乙個順序使得搜尋更加合理減少無謂的搜尋. 如何來確定搜尋的順序?..也就是用乙個值來表示 這個值為f[n]..每次搜尋取f[x]最小的拓展 那麼這個f[n]=h[n]+g[n]

其中f(n) 是節點n的估價函式,g(n)是在狀態空間中從初始節點到n節點的實際代價,h(n)是從n到目標節點最佳路徑的估計代價。在這裡主要是h(n)體現了搜尋的啟發資訊,因為g(n)是已知的。如果說詳細 點,g(n)代表了搜尋的廣度的優先趨勢。但是當h(n) >> g(n)時,可以省略g(n),而提高效率。

a*演算法的估價函式可表示為:

f』(n) = g』(n) + h』(n)   

這裡,f』(n)是估價函式,g』(n)是起點到終點的最短路徑值,h』(n)是n到目標的最短路經的啟發值。由 於這個f』(n)其實是無法預先知道的,所以我們用前面的估價函式f(n)做近似。g(n)代替g』(n),但 g(n)>=g』(n) 才可(大多數情況下都是滿足的,可以不用考慮),h(n)代替h』(n),但h(n)<=h』(n)才可(這一點特別的重 要)。可以證明應用這樣的估價函式是可以找到最短路徑的,也就是可採納的。我們說應用這種估價函式的 最好優先演算法就是

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

10#define ll long long

11using

namespace

std;

12const

int inf = 0x3f3f3f3f;13

const

int maxn = 1111;14

15struct

vertex

20};

21struct

scline1[maxn*maxn],line2[maxn*maxn];

2425

int link1[maxn],link2[maxn],h[maxn],times[1001

];26

intn, m, s, e, k;

27bool

vis[maxn];

28 priority_queue que;

2930

void

init()

3839

void

djikstra()53}

54}5556

intastar()80}

81return -1;82

}8384int

main()

99 cin >> s >> e >>k;

100djikstra();

101 cout << astar() <102}

103return0;

104 }

POJ 2449 第K短路 A 演算法

給定一張n個點,m條邊的有向圖,求從起點到終點t的第k短路的長度。求第k短路,我們先回憶一下dijkstra求最短路的方法。每次鬆弛了乙個節點,則將該節點放入優先佇列,然後在取優先佇列的第乙個點,即源點到該點距離最短的點,再用該點去鬆弛其他的點。最終求出的距離就是單源最短距離。換句話說,就是用優先佇...

poj 2449 第k短路徑

思路 利用乙個估計函式g i dis i len。其中len為佇列出來的點當前已經走了的距離。dis i 為該點到終點的最短路徑。這樣我們只要將點按g i 的公升序在佇列你排序,每次取出最小的g i 值的點。其意義就是每次找最短的能到終點的點。第一次找到就是最短路徑,第二次就是就是第二短,第三次就是...

A 演算法(k短路)模板 poj 2449

a 演算法就是在bfs擴充套件的時候優化了一下,對於乙個點x,當前花費a,到終點花費h x 那a h x 就可以視作它這個點的總花費,這就可以在bfs時優先遍歷花費少的點 include include include includeusing namespace std define ll lon...