A* 第k短路
2024-10-20 10:23:59
#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));
}
最新文章
- Apache curator-client详解
- 字段符号FIELD-SYMBOLS
- iOS开发--即时通讯
- Centos 7 通过YUM安装 PHP7 NGINX1.1.8 POSTGRESQL9.5
- Git 笔记三 Git的初步使用
- Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)
- UE4 径向模糊radiu blur
- nxlog4go 的配置驱动
- c++中字符串的反转
- 分布式job-任务调度(一)
- React列表
- Vuex之理解Getters的用法
- 如何用新安装的jdk替换掉Linux系统默认jdk
- top 内存mem的used很高,或者100%
- rocketmq技术架构图
- NFS服务的端口分配
- oracle 11GR2 单机打补丁PSU 11.2.0.4.180717
- 关于jsonp跨域的 实现
- 【转】百亿级实时大数据分析项目,为什么不用Hadoop?
- 转:hive面试题
热门文章
- Springboot Actuator之十二:actuator aop
- 小白的C++之路——求质数
- Xgboost GPU配置
- 由一个空工程改为SpringBoot工程
- Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)
- Javascript中创建函数的几种方法
- Beego 学习笔记9:Boostrap使用介绍
- 49.react中使用less
- 分页查询——Hibernate Criteria实现一次查询取得总记录数和分页后结果集
- IDEA 创建类是自动添加注释和创建方法时快速添加注释