A* 第k短路
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cctype>
using namespace std;
void read(int &num)
{
char ch;
while(!isdigit(ch=getchar()));
for(num=ch-'0';isdigit(ch=getchar());num=num*10+ch-'0');
}
const int MAXN = 1005;
const int MAXM = 100005;
const int INF = 0x3f3f3f3f;
int n, m;
int fir[MAXN], to[MAXM], nxt[MAXM], wt[MAXM], cnt;
inline void Add(int u, int v, int w) { to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; wt[cnt] = w; }
int rfir[MAXN], rto[MAXM], rnxt[MAXM], rwt[MAXM], rcnt;
inline void rAdd(int ru, int rv, int rw) { rto[++rcnt] = rv; rnxt[rcnt] = rfir[ru]; rfir[ru] = rcnt; rwt[rcnt] = rw; }
int dis[MAXN]; int inq[MAXN];
inline bool SPFA(int T, int S)
{
memset(dis, 0x3f, sizeof dis);
queue<int> Q;
dis[T] = 0; Q.push(T);
while(!Q.empty())
{
int u = Q.front();
if(inq[u] > n) return 0;
for(int i = rfir[u]; i; i = rnxt[i])
if(dis[rto[i]] > dis[u] + rwt[i])
{
dis[rto[i]] = dis[u] + rwt[i];
if(!inq[rto[i]])
Q.push(rto[i]), inq[rto[i]] = 1;
}
Q.pop(); inq[u]--;
}
return dis[S] < INF;
}
struct node
{
int x, g, f;
node(){}
node(int xx, int gg, int ff):x(xx), g(gg), f(ff){}
bool operator <(const node &y)const
{
return y.f == f ? y.g < g : y.f < f;
}
};
inline int K_th(int S, int T, int K)
{
if(!SPFA(T, S)) return -1;
if(S == T) K++;
priority_queue<node>Q;
Q.push(node(S, 0, dis[S]));
int counter = 0;
while(!Q.empty())
{
node u = Q.top(); Q.pop();
if(u.x == T && ++counter == K) return u.g;
for(int i = fir[u.x]; i; i = nxt[i])
Q.push(node(to[i], u.g + wt[i], u.g + wt[i] +dis[to[i]]));
}
return -1;
}
int main()
{
//freopen("data.in", "r", stdin);
int x, y, z;
read(n), read(m);
for(int i = 1; i <= m; i++)
read(x), read(y), read(z), Add(x, y, z), rAdd(y, x, z);
read(x), read(y), read(z);
printf("%d\n", K_th(x, y, z));
}
A* 第k短路的更多相关文章
- POJ 2449 Remmarguts' Date --K短路
题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...
- BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...
- 【POJ】2449 Remmarguts' Date(k短路)
http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...
- poj 2449 Remmarguts' Date K短路+A*
题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...
- 第k短路
poj 2449 模板题 A*+spfa #include<iostream> #include<cstdio> #include<cstring> #inclu ...
- poj 2449(A*求第K短路)
题目链接:http://poj.org/problem?id=2449 思路:我们可以定义g[x]为源点到当前点的距离,h[x]为当前点到目标节点的最短距离,显然有h[x]<=h*[x](h*[ ...
- K短路
K短路 用dijsktra+A*启发式搜索当点v第K次出堆的时候,这时候求得的路径是k短路.A*算法有一个启发式函数f(p)=g(p)+h(p), 即评估函数=当前值+当前位置到终点的最短距离g(p) ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- bzoj 1975 [Sdoi2010]魔法猪学院(k短路)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
随机推荐
- [转帖]如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版 ---暂时未做实验.
如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版 2019-11-09 16:35:30 dingdingfish 阅读数 32更多 ...
- C# - Array.Sort()方法
Array类简介 Array类是C#中所有数组的基类.我们常用的[]声明数组即为Array类的语法,我们可通过Array类提供的各种方法对C#中数组进行操作.最典型的就是数组排序 Array.Sort ...
- Deepo
Deepo is a series of Docker images that allows you to quickly set up your deep learning research env ...
- win10环境变量PATH——路径添加
我的电脑---->属性---->环境变量---->系统变量,选择path,点击“编辑”,“新建”,然后将路径添加上去即可
- python基础03--int,bool,str
1.1 数字int 1.i = 100 i.bit_length() 转化为二进制的最小位数 1.2 布尔 bool 1.True False 0是False 1.3 数据转换 ...
- Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入
Activity跳转动画.淡入淡出.滑入滑出.自定义退出进入 前言: 系统中有两个定义好的Activity跳转动画:fade_in.fade_out.slide_in_left.slide_out_r ...
- FreePascal - CodeTyphon 如何让编译的程序更小!
CodeTyphon 6.9 在菜单[project]-->[project option]的弹出界面中 选择[compiler option]-->[debugging] 1,去掉“Ge ...
- Ubuntu下 安卓 adb 命令报:“insufficient permissions for device: user in plugdev group; ”问题的解决办法
https://blog.csdn.net/freezingxu/article/details/80893025 在接入设备进行联机调试的时候,遇到了这样的问题: insufficient perm ...
- 使 WIN 10进入休眠、睡眠、关机的命令
1.用命令控制定时关机,重启,休眠等 休眠:rundll32.exe powrProf.dll,SetSuspendState 休眠:shutdown -h 睡眠:rundll32.exe powrp ...
- Idea 热部署插件JRebel 安装与环境配置-上海尚学堂Java培训
在企业日常项目开发中,如果我们需要调试一个Java Web项目,就需要先将项目编译之后,放入Web容器或借助Maven web 插件来运行,如果对Java源代码进行修改,那么必须重新编译并重启Web容 ...