A*模板(求K短路)(POJ2449)】的更多相关文章

A*是bfs的优化,IDA*是dfs的优化 A*算法: 为启发式算法中很重要的一种,被广泛应用在最优路径求解和一些策略设计的问题中.而A*算法最为核心的部分,就在于它的一个估值函数的设计上: f(n)=g(n)+h(n) 其中f(n)是每个可能试探点的估值,它有两部分组成:一部分为g(n),它表示从起始搜索点到当前点的代价(通常用某结点在搜索树中的深度来表示).另一部分,即h(n),它表示启发式搜索中最为重要的一部分,即当前结点到目标结点的估值,h(n)设计的好坏,直接影响着具有此种启发式函数的…
题目背景 感谢@kczno1 @X_o_r 提供hack数据 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig 今天就在进行一个麻烦的测验.iPig 在之前的学习中已经知道了很多种元素,并学会了可以转化这些元素的魔法,每种魔法需要消耗 iPig 一定的能量.作为 PKU 的顶尖学猪,让 i…
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=510,M=1e4+10; int n,m,k,dis[N],backup[N]; //dis数组表示dis[i]到起点的距离. struct { int a,b,w; }edge[M]; //bellman-ford可以求出来图中有没有负权回路. //迭代k次返回的数表示:从起点经过不超过k…
说实话,看到这道题的洛谷评级我傻了(传说中的最高难度) 然后看完题目才确定这真的是一道k短路的裸题. 也就敲了个A*吧,15分钟竟然没有调试一遍过. 欧洲玄学. 看题目,主要是找几条从1走到n的路加起来小于等于给定的E即可. 所以就是一道k短路. A*和DJ很像,就是把堆的比较操作从当前路径长度+该点到n点的长度. 后面的那个就是估价函数了,打SPFA或DJ都可以. 然后STL堆搞一波就可以了. CODE // luogu-judger-enable-o2 #include<cstdio> #…
显然每次贪心的走最少消耗的路径即可.那么也就是找出最短路,次短路,,,K短路之后消耗E的能量的最多的路径条数. 也就是裸的A*算法. #include <bits/stdc++.h> using namespace std; typedef double lf; , M=; lf d[N], En; typedef pair<lf, int> pr; #define mkpr(x, y) make_pair<lf, int> (x, y) priority_queue&…
题目链接 优先队列bfs第一次出队就是最短路,那么显然第k次出队就是k短路 ?????????????????????????????? 书上写的 但是直接优先队列bfs会T,所以用A*优化就行,估价函数就是到终点的最短路. #include <cstdio> #include <queue> #include <algorithm> #include <cmath> using namespace std; const int MAXN = 5010; c…
#include<cstdio> #include<queue> #include<cstring> using namespace std; const int maxn=2e6+5; struct asd{ int from,to,next,val; }b[maxn],b2[maxn]; int head[maxn],tot=1; int h2[maxn],t2=1; int n,m; void ad(int aa,int bb,int cc){ b[tot].fr…
引理:当一个状态对应的节点第K次从堆中取出时,该状态对应的当前代价是从起点到该点的第K优解. 代码如下 /* POJ2449 */ #include <cstdio> #include <iostream> #include <memory.h> #include <queue> #include <cstring> #include <vector> using namespace std; const int maxv=1010;…
模板题 #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; int n, m, hea[5005], cnt, uu, vv, ans; double e, ww, dis[5005]; const double eps=1e-7; bool vis[5005]; struct Edge{ int too, nxt; do…
1.到底如何求k短路的? 我们考虑,要求k短路,要先求出最短路/次短路/第三短路……/第(k-1)短路,然后访问到第k短路. 接下来的方法就是如此操作的. 2.f(x)的意义? 我们得到的f(x)更小,优先访问这个f(x)的点. 我们可以定义一组数{p,g,h},p是某一个点,g是估价,h是实际,那么g+h更小的点p会优先访问. 为什么呢?因为假设我们求出了w短路,接下来要求(w+1)短路,就要求最小的另一条路径. 应该易理解. 3.为什么选择最短路来估价? 很简单的选择,我们既然要求最短了,当…