A*+SPFA算法:?
(1)將有向圖的所有邊正向、反向分別存入兩個不同的邊集(Edges,Edges1)中。用反向邊集,以所求終點t為源點,利用SPFA或Dijkstra求解出所有點到t的最短路徑,用Dist[i]數組來表示點i到點t的最短距離。?
(2)建立一個優先隊列,將源點s加入到隊列中。?
(3)從優先隊列中取出最小的點p,如果點p == t,則計算t出隊的次數。如果當前路徑長度就是s到t的第k短路長度,算法結束。否則遍歷與p相連的所有的邊,將擴展出的到p的鄰接點信息加入到優先隊列中取。?
注意:?
當s == t的時候,需要計算第k+1短路。因為s到t這條距離為0的路不能算是這k短路里邊,當s == t的時候,只需要將k = k+1后再求第k短路就可以了。
<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<iostream></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<algorithm></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<cstdio></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<cstring></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<queue></span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">namespace</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MAXN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1100</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MAXM = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">110000</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> INF = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0xffffff0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> EdgeNode
{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> to;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> w;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> next;
}Edges[MAXM],Edges1[MAXM];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> Head[MAXN],Head1[MAXN];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> Node
{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> to;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> g,f;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">operator</span> < (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Node &r) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span>{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(r.f == f)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> r.g < g;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> r.f < f;}
};
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> vis[MAXN],Dist[MAXN];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> A_Star(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> start,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> end,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> N,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k)
{Node e,ne;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> Cnt = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;priority_queue<Node> que;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(start == end)k++;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[start] == INF)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;e.to = start;e.g = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;e.f = e.g + Dist[e.to];que.push(e);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>( !que.empty() ){e = que.top();que.pop();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(e.to == end)Cnt++;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Cnt == k)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e.g;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = Head[e.to]; i != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i = Edges[i].next){ne.to = Edges[i].to;ne.g = e.g + Edges[i].w;ne.f = ne.g + Dist[ne.to];que.push(ne);}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> SPFA(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> s,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> N)
{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i <= N; ++i)Dist[i] = INF;<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(vis,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(vis));vis[s] = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;Dist[s] = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">queue</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span> Q;Q.push(s);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>( !Q.empty() ){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> u = Q.front();Q.pop();vis[u] = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = Head1[u]; i != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i = Edges1[i].next){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> temp = Dist[u] + Edges1[i].w;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(temp < Dist[Edges1[i].to]){Dist[Edges1[i].to] = temp;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(!vis[Edges1[i].to]){vis[Edges1[i].to] = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;Q.push(Edges1[i].to);}}}}
}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main()
{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> N,M,u,v,w,s,t,k;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(~<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">scanf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d%d"</span>,&N,&M)){<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(Edges,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(Edges));<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(Edges1,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(Edges1));<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(Head,-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(Head));<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(Head1,-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(Head1));<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < M; ++i){<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">scanf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d%d%d"</span>,&u,&v,&w);Edges[i].to = v;Edges[i].w = w;Edges[i].next = Head[u];Head[u] = i;Edges1[i].to = u;Edges1[i].w = w;Edges1[i].next = Head1[v];Head1[v] = i;}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">scanf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d%d%d"</span>,&s,&t,&k);SPFA(t,N);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> kthlenth = A_Star(s,t,N,k);<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d\n"</span>,kthlenth);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}</code>
總結
以上是生活随笔為你收集整理的K短路【模板】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。