題意:給出乙個有向圖,求s到t的第k短路;
思路:k短路模板題,可以用a_star模板過;
單源點最短路徑+高階搜尋a*;
a*演算法結合了啟發式方法和形式化方法;
啟發式方法通過充分利用圖給出的資訊來動態地做出決定而使搜尋次數大大降低;
形式化方法不利用圖給出的資訊,而僅通過數學的形式分析;
演算法通過乙個估價函式f(h)來估計圖中的當前點p到終點的距離,並由此決定它的搜尋方向;
當這條路徑失敗時,它會嘗試其他路徑;
對於a*,估價函式=當前值+當前位置到終點的距離,即f(p)=g(p)+h(p),每次擴充套件估價函式值最小的乙個;
對於k短路演算法來說,g(p)為當前從s到p所走的路徑的長度;h(p)為點p到t的最短路的長度;
f(p)的意義為從s按照當前路徑走到p後再走到終點t一共至少要走多遠;
為了加速計算,h(p)需要在a*搜尋之前進行預處理, 因為本題是有向圖,所以將原圖的所有邊反向,再從終點t做一次單源點最短路徑就能得到每個點的h(p)了;
演算法步驟:
(1),將有向圖的所有邊反向,以原終點t為源點,求解t到所有點的最短距離;
(2),新建乙個優先佇列,將源點s加入到佇列中;
(3),從優先順序佇列中彈出f(p)最小的點p,如果點p就是t,則計算t出隊的次數;
如果當前為t的第k次出隊,則當前路徑的長度就是s到t的第k短路的長度,演算法結束;
否則遍歷與p相連的所有的邊,將擴充套件出的到p的鄰接點資訊加入到優先順序佇列;
以上這段話摘自其它部落格,感覺寫的不錯...
**:
1 #include2 #include3 #includeview code4 #include5
#define maxn 1010
6using
namespace
std;78
const
int inf=0x3f3f3f3f;9
int dist[maxn]; //
**dist[i]記錄此時源點到i的最短距離
10bool vis[maxn]; //
***標記點是否在佇列中
11int cnt[maxn]; //
***cnt[i]記錄i節點入隊次數,判斷是否存在負權環
12 vectorint, int> >mp[maxn*100], mp2[maxn*100];//
mp儲存原圖,mp2儲存反向圖
13struct
node
19};
2021
int a_star(int s, int e, int n, int
k)27
if(dist[s]==inf)
30node node1;
31 node1.point=s;
32 node1.g=0
;33 node1.f=dist[s]+node1.g;
34q.push(node1);
3536
while(!q.empty())
42if(cnt==k)
45for(int i=0; i//
**遍歷當前節點的所有鄰節點
46node node2;
47 node2.point=mp[cc.point][i].first;
48 node2.g=cc.g+mp[cc.point][i].second;
49 node2.f=node2.g+dist[node2.point];
50q.push(node2);51}
52}53return -1;54
}5556bool spfa(int n, int s)
62q.push(s);
63 dist[s]=0
;64 cnt[s]+=1
;65 vis[s]=true;66
while(!q.empty())81}
82}83}
84}85return
true;86
}8788int main(void)98
ints, e, k;
99 cin >> s >> e >>k;
100spfa(n, e);
101int res=a_star(s, e, n, k);
102 cout << res <
103return0;
104 }
poj 2449 k短路模板
include include include include include using namespace std const int maxn 1001 const int maxm 100001 const int inf 1 30 struct edge edge e1 maxm edge...
poj 2449 k短路 A 演算法
k短路的定義 1.如果起點終點相同,那麼0並不是最短路,而是要出去一圈回來之後才是最短路,那麼第k短路也是一樣。2.每個頂點和每條邊都可以使用多次。可以存在環和來回走 給定起終點,求k短路的長度 然後求k短路使用a 演算法,其估價函式f n g n h n h n 是終點到結點n的最短路徑,g n ...
POJ 2449 K短路 A 搜尋
題目鏈結 題意 求乙個有向圖的k kk短路長度。思路 經典問題的經典演算法 a a a 搜尋。感覺a a a 搜尋和dij kstr adijkstra dijkst ra堆優化寫法有很多類似的地方。首先以每個點到終點的最短距離作為估計函式g gg,故先需要反向建圖,隨後對反圖從終點t tt做一遍d...