给定一张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 ;
}

最新文章

  1. IOS开发之—— iOS 支付 [支付宝、银联、微信]
  2. [php]表单和验证
  3. 为 Date 对象添加 ago 属性
  4. hdu4055 dp
  5. dedecms友情链接flink的调用方法
  6. 如何使用 ui-router-extras
  7. Cypher查询语言--Neo4j-MATCH(二)
  8. HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)
  9. Java Core - JVM运行时内存管理
  10. 过滤函数 filter
  11. Unity 获取指定资源目录下的所有文件
  12. 前景检测(1):VIBE
  13. ubuntu14.04下开启ssh服务
  14. 黄聪:jquery.bootgrid表格插件有的属性(visibleInSelection、cssClass、headerCssClass、headerAlign)不能识别的解决办法
  15. [转]PHP利用Gearman来处理并行多进程问题
  16. apicloud api.openwin
  17. Java回顾之网络通信
  18. PHP 中的文本截取分析之效率
  19. JNI由浅入深_3_Hello World
  20. rxjs自定义operator

热门文章

  1. java的设计模式的一些链接,站在巨人的肩膀上,才能看的更远。(均来源与网上的各个大牛的博客中)
  2. 怎样理解ECMAScript 和 JavaScript的关系
  3. javaIO——BufferedWriter
  4. VUE实现简单的全选/全不选
  5. 安卓开发之SimpleAdapter的使用
  6. flutter主题颜色
  7. JPA中的复杂查询
  8. Django—model系统:ORM对数据库操作
  9. 【实用linux命令记录】
  10. 通过JDBC驱动加载深刻理解线程上下文类加载器机制