博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AcWing:178. 第K短路(A*)
阅读量:5087 次
发布时间:2019-06-13

本文共 1930 字,大约阅读时间需要 6 分钟。

给定一张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”。

数据范围

1S,TN10001≤S,T≤N≤1000,

0M1050≤M≤105,
1K10001≤K≤1000,
1L1001≤L≤100

输入样例:

2 21 2 52 1 41 2 2

输出样例:

14

 

算法:A*

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

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

 

转载于:https://www.cnblogs.com/buhuiflydepig/p/11383538.html

你可能感兴趣的文章
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>
Animations介绍及实例
查看>>
判断请求是否为ajax请求
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>
VIM工具
查看>>
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>