heap.push({ed, 0}); dist[ed] = 0; while (!heap.empty()) { auto t = heap.top(); heap.pop();
int u = t.u; if (vis[u]) continue; vis[u] = true;
for (auto y : rg[u]) { int v = y.u, w = y.w; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; heap.push({v, dist[v]}); } } } }
intastar() { priority_queue<Node> heap; heap.push({dist[st], 0, st}); // 初始点到终点的f值为dist[st] + 0,起点到自身的距离为 0 while (!heap.empty()) { auto t = heap.top(); heap.pop(); int idx = t.idx, distance = t.g; // 取出编号和st点到该点的实际距离 cnt[idx] ++; // 小优化 if (cnt[ed] == k) return distance; // 如果终点遍历了 k 次,直接return掉 for (auto y : g[idx]) { int v = y.u, w = y.w; if (cnt[v] < k) heap.push({distance + w + dist[v], distance + w, v}); // 该状态仍可扩展 } } return-1; // 无解时直接 return }
signedmain() { // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n >> m; for (int i = 1; i <= m; i ++) { int u, v, w; cin >> u >> v >> w; g[u].push_back({v, w}); // 正向建图 rg[v].push_back({u, w}); // 反向建图 } cin >> st >> ed >> k; if (st == ed) k ++; // 题目要求,至少要有一条路 dijkstra(); // cout << dist[st] << '\n'; // if (dist[st] == INF) cout << -1 << '\n'; cout << astar() << '\n'; // 输出 k 短路 return0; }