给定一张N个点(编号1,2…N),M条边的有向图,求从起点S到终点T的第K短路的长度,路径允许重复经过点或边。

注意: 每条最短路中至少要包含一条边。

输入格式

第一行包含两个整数N和M。

接下来M行,每行包含三个整数A,B和L,表示点A与点B之间存在有向边,且边长为L。

最后一行包含三个整数S,T和K,分别表示起点S,终点T和第K短路。

输出格式

输出占一行,包含一个整数,表示第K短路的长度,如果第K短路不存在,则输出“-1”。

数据范围

1≤S,T≤N≤10001≤S,T≤N≤1000,
0≤M≤1050≤M≤105,
1≤K≤10001≤K≤1000,
1≤L≤1001≤L≤100

输入样例:

2 2
1 2 5
2 1 4
1 2 2

输出样例:

14

算法:A*

题解:预估函数是当前点到终点的距离,所以用spfa反方向跑一遍即可,利用优先队列,使当前总路径长度加上预估函数总和的最小值排序,求出第k短路即可。

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue> using namespace std; #define INF 0x3f3f3f3f
const int maxn = 1e5+; struct node {
int v, l, f;
friend bool operator < (node a, node b) {
return a.l + a.f > b.l + b.f;
}
}; vector<pair<int, int> > g[maxn], gg[maxn];
int dis[maxn];
int vis[maxn]; int main() {
int n, m;
scanf("%d %d", &n, &m);
for(int i = ; i<= m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
g[u].push_back(make_pair(v, w)); //正向建图
gg[v].push_back(make_pair(u, w)); //反向建图
}
int s, t, k;
scanf("%d %d %d", &s, &t, &k);
for(int i = ; i <= n; i++) {
dis[i] = INF;
}
dis[t] = ;
queue<int> q;
q.push(t);
while(!q.empty()) { //反向跑一遍spfa
int u = q.front();
q.pop();
vis[u] = ;
int len = gg[u].size();
for(int i = ; i < len; i++) {
int v = gg[u][i].first;
int w = gg[u][i].second;
if(dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if(!vis[v]) {
vis[v] = ;
q.push(v);
}
}
}
}
if(dis[s] == INF) { //判断是否连通
printf("-1\n");
return ;
}
int cnt = ;
if(s == t) { //如果当前起点和终点重叠,则k多算一次
k++;
}
priority_queue<node> pq;
pq.push((node){s, , });
while(!pq.empty()) { //跑一遍A*
node now = pq.top();
pq.pop();
if(now.v == t) {
cnt++;
if(cnt == k) {
printf("%d\n", now.l);
return ;
}
}
int u = now.v;
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i].first;
int w = g[u][i].second;
pq.push((node){v, w + now.l, dis[v]});
}
}
printf("-1\n"); //没找到
return ;
}

AcWing:178. 第K短路(A*)的更多相关文章

  1. POJ 2449 Remmarguts' Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...

  2. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  3. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

  4. 【POJ】2449 Remmarguts' Date(k短路)

    http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...

  5. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

  6. 第k短路

    poj 2449 模板题  A*+spfa #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  7. poj 2449(A*求第K短路)

    题目链接:http://poj.org/problem?id=2449 思路:我们可以定义g[x]为源点到当前点的距离,h[x]为当前点到目标节点的最短距离,显然有h[x]<=h*[x](h*[ ...

  8. K短路

    K短路 用dijsktra+A*启发式搜索当点v第K次出堆的时候,这时候求得的路径是k短路.A*算法有一个启发式函数f(p)=g(p)+h(p), 即评估函数=当前值+当前位置到终点的最短距离g(p) ...

  9. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

随机推荐

  1. C# 使用Emit实现动态AOP框架 (三)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  2. asp.net page类

    1  page 继承自control类 2 httpServerUtility的transfer方法:请求生命周期将在调用此方法之后终止,将不会触发后续的请求生命周期事件,将直接跳到logReques ...

  3. 在vue中引用echarts导致Cannot read property getAttribute of null ?

    报错信息如下: 之前一直用echarts没有出现过这个问题,所以当这个问题出现时我就开始了各种查,试了几种方法依旧报错,比如: 1.在mounted() {},写成如下形式:(依旧报错) this.$ ...

  4. JAVA线程池例子

    用途及用法 网络请求通常有两种形式:第一种,请求不是很频繁,而且每次连接后会保持相当一段时间来读数据或者写数据,最后断开,如文件下载,网络流媒体等.另 一种形式是请求频繁,但是连接上以后读/写很少量的 ...

  5. 【SpringBoot】Web开发

    一.简介 1.1 引入SpringBoot模块 1.2 SpringBoot对静态资源的映射规则 二.模版引擎 2.1 简介 2.2 引入thymeleaf 2.3 Thymeleaf使用 一.简介 ...

  6. 在线预览word、excel文件

    直接使用微软提供的在线预览服务. 免费 文件必须为网可访问地址,因为微软的服务器需要访问该文件

  7. 【异常】Cannot run program "git" (in directory "/mnt/software/azkaban-3.79.0"): error=2, No such file or directory

    1 安装azkaban异常 cloudera-scm@cdh4 azkaban-3.79.0]$ ./gradlew build -x test Parallel execution with con ...

  8. Django项目上线的准备工作

    settings文件配置 添加上STATIC_ROOT = os.path.join(BASE_DIR, "/static/") 我的配置项目文件的最终 STATIC_URL = ...

  9. Django 语法笔记

    Django 语法 创建项目框架 django-admin startproject 项目名 创建子app 业务分化,可以优化团队合作,可以明确找锅 python manage.py startapp ...

  10. 拆机联想ideapad s500

    这是我第一次拆机,中间也是经历了各种艰难险阻,最后还算是成功.首先,说一下拆机得目的:很简单,为了加一个内存条:下面具体说拆机得步骤: 第一步,在网上查攻略,刚开始的时候,并没有很详细的具体到机型,只 ...