题意:给一个有向图,求起点s到终点e的第K短路长度,没有就输出-1.
思路:先用dijkstra处理出所有点到终点的最短路径长度,保存在dist数组中。
然后用A*算法,按照g+h从小到大排序,g是到当前点的代价,h是当前点到终点的预期代价,即dist数组。用times记录每个点被找到的次数,每次从队列中弹出一个新的点,就将这个点的times加一,直到第k次找到终点即可。如果dist[s]==inf,则说明终点不可达,直接返回-1即可。
因为dijkstra求的是所有点到终点的最短距离,这是个有向图,所以建图的时候要反向建一个G2用来做dijkstra,这里没注意被卡了很久。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <cstdlib>
#include <set>
#include <string>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
struct edge{
int v, w, nxt;
}G[100005], G2[100005];
int tot, pre[maxn], t2, p2[maxn];
void add(int u, int v, int w) {
G[tot].v