AcWing:178. 第K短路(A*)
给定一张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*)的更多相关文章
- 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 ...
随机推荐
- MyBatis 源码篇-整体架构
MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...
- 怎样获取响应头: Response Header
1. 使用 xhr.getResponseHeader()可以获取指定响应头字段值. function getHeaderTime() { console.log(this.getResponseHe ...
- 11-MySQL DBA笔记-MySQL的监控
第11章 MySQL的监控 为什么我们需要监控呢?因为如果没有了监控,那么我们的服务可用性就无从度量,我们也无法及时地发现问题和处理问题.一个完善的监控体系,不仅需要进行实时的监控,也需要分析历史的监 ...
- StoneTab标签页CAD插件 3.2.5
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- React中,input外边如果包一个div,可以把input的onChange事件绑定到div上面,并且也生效
最近第一次开始学习封装组件,遇到几个比较神奇的问题. 首先就是如果input外边包一个div,如果把input的onChange事件绑定到div上,也会生效 <div onChange={(e) ...
- 组合:abc三个字符的所有组合
求所有组合也就是abc各个位是否选取的问题,第一位2中可能,第二位2种...所以一共有2^n种.用0表示不取,1表示选取,这样可以用110这样的形式表示ab.abc一共的表示形式从0到2^3-1.然后 ...
- Python: NumPy, Pandas学习资料
NumPy 学习资料 书籍 NumPy Cookbook_[Idris2012] NumPy Beginner's Guide,3rd_[Idris2015] Python数据分析基础教程:NumPy ...
- 基于SAML2.0的SAP云产品Identity Authentication过程介绍
SAP官网的架构图 https://cloudplatform.sap.com/scenarios/usecases/authentication.html 上图介绍了用户访问SAP云平台时经历的Au ...
- 12.JDBC
/*使用JDBC处理大数据*/ 在实际开发中,程序需要把大文本或二进制数据保存到数据库中 大数据LOB(Large Objects),LOB又分为clob和blob clob用来存储大文本 blob用 ...
- 【Java并发】并发队列与线程池
并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...