给定一张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. hdu 1502 大数dp

    对于每一个dp的问题 从其最优解的结构(分哪几种形式或者情况)入手 然后分析状态 这样就比较好找出状态转方程这里数据结构的选择很简单 顺序数组就可以 填充的方式顺序填充就可以 然后这道题目卡了我大数. ...

  2. 10-MySQlL DBA笔记-基础知识

    第四部分 运维篇 首先来了解一下数据库的定义,数据库是高效的.可靠的.易用的.安全的多用户存储引擎,我们可以通过它访问大量的持久化数据.我们管理和维护数据库,本质上也是要确保如上的特性,尽可能地保证数 ...

  3. Python 字符串——巧取值和列表——巧取值 对比

    Python 字符串——巧取值和列表——巧取值 对比 1.字符串取值实例: samp_string = "Whatever you are, be a good one." for ...

  4. 错误:The following error occurred attempting to run the DNX design time process (dnx-clr-win-x86.1.0.0-rc1-final)

    其实这个错误很容易解决.设置一个startup工程即可.

  5. HTML导航条的制作

    导航条的制作HTML代码:<nav> <ul> <li> <a href="#"></a> </li> &l ...

  6. c++容易混淆知识点

    C ++令人困惑的知识点1 函数传递指针和传递引用之间的区别? 1 GT;指针定义可能未初始化,但引用不可能; 2 - ;引用只能与一个实体组合,指针可以与多个实体组合; 3 GT;加法和减法的含义是 ...

  7. css height属性中的calc方法

    例如父盒子是100%的高度 盒子里面的head部分固定位140px 内容部分始终为剩余的全部高度 height: calc(100% - 140px); 切结"+或-"两边要有空格 ...

  8. 9.Spring整合Hibernate_2_声明式的事务管理(Xml的方式)

    使用xml的方式进行声明式的事务管理 推荐使用xml的方式,因为可以同时为多个方法进行声明 <!-- 开启Spring中的事务管理(声明式的事务管理) xml--> <!-- 不管是 ...

  9. 第一章、接口规范之web-api接口

    1.什么是Web API接口 通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介 Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点 u ...

  10. 018.查询练习50题(sql实例)

    CREATE TABLE EMP(EMPNO numeric(5,0) NOT NULL primary key,--雇员的编号ENAME nvarchar(10) not null,--雇员的名字J ...