K短路【模板】
2015-05-13 20:56
337 查看
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短路就可以了。
(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>
相关文章推荐
- A*求单元第k短路的模板
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
- 最短路(floyd/dijkstra/bellmanford/spaf 模板)
- 最短路径(最基础,经典的模板和思想):HDU-2544最短路
- 洛谷P3371-【模板】单源最短路【SPFA】
- 【模板】最短路&&最小生成树
- 单元最短路模板 dijistra
- 最短路 - bellman-ford 算法模板
- 最短路-dijkstra与floyd的邻接矩阵模板示例
- UVA11374最短路模板
- 常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- 最短路~dijkstra堆优化模板
- 最短路 - - 模板
- 【模板】【图论】最短路
- Bellman_ford 求最短路模板
- 单源最短路 SPFA 算法模板
- 洛谷1339 热浪(最短路模板)
- HDU 2544 最短路 SPFA 邻接表 模板
- 求最短路即次短路模板,一条边可以重复走的HDU6181