沒太想明白(就當存在模板吧)
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int maxn = 1e5 + 7
;const
int inf = 1e9 + 7
;int
n, m, k;
intstart, end;
intans;
//最短路部分
intdis[maxn];
bool
vis[maxn];
struct
node
};/*
* a* 啟發式搜尋函式 f[x] = h[x] + g[x]
* 變數 hx 表示搜尋到當前點 所用的代價
* 變數 gx 是估價函式 (估價函式要小於等於實際值,否則出錯) */
struct
edge
};/*
* count 記錄第幾次bfs拓展到此點
* 當 count == k 時 不再對此點繼續進行拓展(因為拓展的點必定大於 第k短路) */
intcount[maxn];
vector
g[maxn], g2[maxn];
/** (因為是有向圖所以反向建圖)
* 求end到每個點的最短路 */
void
dijkstra()
); dis[end] = 0
; node q;
intv, w;
while(!que.empty()));}}
}}/*
* 第k短路演算法 = a* + bfs */
void
astar());
edge q;
intv, hx, gx;
while(!que.empty())
if(count[v] >k)
continue
;
intto, hx, gx;
int _size=g[v].size();
for(int i = 0 ; i < _size ; i++));}
}while(!que.empty())
que.pop();
return;}
intmain());
g2[v].push_back();
}scanf(
"%d %d %d
",&start, &end, &k);
//此題要求start和end相同的時候 第一短路不是0 ,所以k++
if(start ==end)
k++;
dijkstra();
astar();
printf(
"%d\n
",ans);
}return0;
}/*1 12 2 5
2 2 1
*/
第K短路 嚴格第K短路
所謂k短路,就是從s到t的第k短的路,第1短就是最短路。如何求第k短呢?有一種簡單的方法是廣度優先搜尋,記錄t出佇列的次數,當t第k次出佇列時,就是第k短路了。但點數過大時,入佇列的節點過多,時間和空間複雜度都較高。a 是在搜尋中常用的優化,一種啟發式搜尋。簡單的說,它可以用公式表示為f n g n...
K短路 模板
a spfa演算法 1 將有向圖的所有邊正向 反向分別存入兩個不同的邊集 edges,edges1 中。用反向邊集,以所求終點t為源點,利用spfa或dijkstra求解出所有點到t的最短路徑,用dist i 陣列來表示點i到點t的最短距離。2 建立乙個優先佇列,將源點s加入到佇列中。3 從優先佇列...
第K短路(A 演算法)
對於無向圖 spfa a 演算法 先用spfa求目標結點到各個結點的最短路徑 然後,取g x 為從初始結點到當前結點x的路徑長度,h x 為從x結點到目標結點的最短路徑長度,即h x 取dis x 即可,估價函式f x g x h x 對於有向圖 spfa a 演算法 顯然應將有向邊取反,然後求目標...