第一道第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 #include3 #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...