對於無向圖:
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短路徑。一條路徑可以由兩部分組成,第一部分是乙個從出發到達任意點的任意路徑,而第二部分是從第一部分的末端出發,到終點的最短路徑。兩部分正好可以組成一條路徑,且每一條路徑都可以分解這兩部分 允許任意一部分為空 因此當我們...