第K短路(A 演算法)

2021-08-05 23:12:09 字數 809 閱讀 3852

對於無向圖:

spfa+a*演算法:先用spfa求目標結點到各個結點的最短路徑;然後,取g(x)為從初始結點到當前結點x的路徑長度,h(x)為從x結點到目標結點的最短路徑長度,即h(x)取dis[x]即可,估價函式f(x)=g(x)+h(x)。

對於有向圖:

spfa+a*演算法:顯然應將有向邊取反,然後求目標節點到各個結點的最短路徑;後面和上述一樣。

**:struct node

};void spfa(int t)

dis[t]=0;

queueque;

que.push(t);

vis[t]=1;

while(!que.empty())}}

}} struct cnode

friend bool operator < (cnode a,cnode b)//過載比較運算子

};int a_star(int s)

{ int i;

if(dis[s]==inf)return -1;//若s到t不連通的話,提前終止

priority_queueque;

memset(cnt,0,sizeof(cnt));

que.push(cnode(s,0));

while(!que.empty())

{cnode a=que.top();que.pop();

int u=a.u;

int len=a.len;

cnt[u]++;

if(cnt[t]==k) return len;//k=1,最短路,k=n,第k短路

for(i=0;i

第K短路 嚴格第K短路

所謂k短路,就是從s到t的第k短的路,第1短就是最短路。如何求第k短呢?有一種簡單的方法是廣度優先搜尋,記錄t出佇列的次數,當t第k次出佇列時,就是第k短路了。但點數過大時,入佇列的節點過多,時間和空間複雜度都較高。a 是在搜尋中常用的優化,一種啟發式搜尋。簡單的說,它可以用公式表示為f n g n...

第K短路(A (astar)演算法)

給定一張n個點 編號1,2 n m條邊的有向圖,求從起點s到終點t的第k短路的長度,路徑允許重複經過點或邊。注意 每條最短路中至少要包含一條邊。輸入格式 第一行包含兩個整數n和m。接下來m行,每行包含三個整數a,b和l,表示點a與點b之間存在有向邊,且邊長為l。最後一行包含三個整數s,t和k,分別表...

A 演算法求第k短路徑

a 演算法是一類貪心演算法,其可以用於尋找最優路徑。我們可以利用a 演算法來求第k短路徑。一條路徑可以由兩部分組成,第一部分是乙個從出發到達任意點的任意路徑,而第二部分是從第一部分的末端出發,到終點的最短路徑。兩部分正好可以組成一條路徑,且每一條路徑都可以分解這兩部分 允許任意一部分為空 因此當我們...