a*演算法,也叫啟發式搜尋,就是設計乙個預估函式,然後在搜尋的過程中進行有序的搜尋,我們設到目前狀態的花費為f(x),到目標狀態的估計花費為h(x),那麼我們按照h(x)+f(x)排序即可,這道題裡起點到目前的距離為f(x),目前到終點的最短路為g(x),然後進行暴力搜尋即可。—— by vane
#includeusingnamespace
std;
const
int n=55
;const
int m=10050
;const
int inf=1e9;
intn,m,s,t,tot,cnt,k;
inth1[n],h2[n],dis[n];
bool
in[n];
struct
edge
edge(
int to,int nxt,int
w): to(to),nxt(nxt),w(w){}
}e1[m],e2[m];
void add(int a,int b,int
c)struct
data
}t;bool
cmp(data x,data y)
void
spfa()
dis[e2[i].to]=dis[x]+e2[i].w;}}
}void
solve()
for(int i=h1[x.u];i;i=e1[i].nxt)
}if(ans.size()sort(ans.begin(),ans.end(),cmp);
for(int i=0;i1].path.size();++i)
printf(
"%d%c
",ans[k-1].path[i],(i+1)==ans[k-1].path.size()?'
\n':'-'
);}intmain()
for(int i=1;i<=m;++i)
spfa();
solve();
}
K短路(A 演算法)
給乙個有向圖,求從a點到b點的第k短路 簡單路徑 長度相同的路徑按照字典序排序 a 演算法是經過估價函式優化排序過的bfs演算法 估價函式為 f n g n h n 其中 f n 態經過狀態 n 到達最終狀態的代價估計,g n 表示由初始狀態到達狀態 n 的實際代價,h n 表示由狀態 n 到最終狀...
第K短路(A 演算法)
對於無向圖 spfa a 演算法 先用spfa求目標結點到各個結點的最短路徑 然後,取g x 為從初始結點到當前結點x的路徑長度,h x 為從x結點到目標結點的最短路徑長度,即h x 取dis x 即可,估價函式f x g x h x 對於有向圖 spfa a 演算法 顯然應將有向邊取反,然後求目標...
第K短路(A (astar)演算法)
給定一張n個點 編號1,2 n m條邊的有向圖,求從起點s到終點t的第k短路的長度,路徑允許重複經過點或邊。注意 每條最短路中至少要包含一條邊。輸入格式 第一行包含兩個整數n和m。接下來m行,每行包含三個整數a,b和l,表示點a與點b之間存在有向邊,且邊長為l。最後一行包含三個整數s,t和k,分別表...