社区讨论
K短路代码求助
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yhvp9
- 此快照首次捕获于
- 2025/11/21 05:41 4 个月前
- 此快照最后确认于
- 2025/11/21 05:41 4 个月前
CPP
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>
using namespace std;
template <typename Type>
inline int read(Type& x) {
x = 0; char c = getchar(), f = 1;
for(; c < '0' || c > '9'; c = getchar())
if(c == -1) return -1;
else if(c == '-') f = -1;
for(; c >= '0' && c <='9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
x *= f; return 1;
}
template <typename Type>
inline int write(Type x) {
if(x < 0) putchar('-'), x = (~x) + 1;
if(x / 10) { return write(x / 10) && putchar(x % 10 | 48); }
return putchar(x % 10 | 48);
}
template <typename Type>
inline int write(Type x, char c) { return write(x) && putchar(c); }
int n, m;
struct edge {
int u; long long w;
inline edge(int U = 0, long long W = 0) { u = U, w = W; }
inline bool operator < (const edge& b) const { return w > b.w; }
};
vector<edge> G[1001], R[1001];
int s, e, k;
int dis[1001]; int vis[1001];
inline void Dijkstra(int s) {
priority_queue<edge> q;
q.push(s);
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
dis[s] = 0;
while(!q.empty()) {
edge t = q.top(); q.pop();
if(t.w != dis[t.u] || vis[t.u]) continue;
vis[t.u] = 1;
for(int i = 0; i < int(R[t.u].size()); i++) {
edge t1 = R[t.u][i];
if(!vis[t1.u] && dis[t1.u] > dis[t.u] + t1.w) {
dis[t1.u] = dis[t.u] + t1.w;
t1.w = dis[t1.u];
q.push(t1);
}
}
}
}
struct node {
int u; long long g, h;
inline node(int U = 0, long long G = 0, long long H = 0) { u = U, g = G, h = H; }
inline bool operator < (const node& rhs) const { return g + h > rhs.g + rhs.h; }
};
inline long long KthPath(int s, int e, int k) {
if(dis[s] == 0x3f3f3f3f) return -1;
memset(vis, 0, sizeof vis);
priority_queue<node> q;
q.push(node(s, 0, dis[s]));
while(!q.empty()) {
node t = q.top(); q.pop();
int u = t.u;
for(int i = 0; i < int(G[u].size()); i++) {
node t1(G[u][i].u, t.g + G[u][i].w, dis[G[u][i].u]);
vis[t1.u]++;
if(t1.u == e && vis[t1.u] == k) return t1.g + t1.h;
q.push(t1);
}
}
return -1;
}
inline bool cmp(edge a, edge b) { return a.w < b.w; }
int main() {
read(n), read(m);
for(int i = 1; i <= m; i++) {
int u, v, w; read(u), read(v), read(w);
G[u].push_back(edge(v, w));
R[v].push_back(edge(u, w));
}
for(int i = 1; i <= n; i++)
sort(G[i].begin(), G[i].end(), cmp);
read(s); read(e); read(k);
Dijkstra(e);
long long ans = KthPath(s, e, k);
write(ans);
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...