社区讨论
55pts 求条
P4568[JLOI2011] 飞行路线参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mkgn59lk
- 此快照首次捕获于
- 2026/01/16 16:53 上个月
- 此快照最后确认于
- 2026/01/18 19:55 上个月
PY
#include <iostream>
#include <vector>
#include <queue>
#define ll long long
#define MAXN 5000010
using namespace std;
const ll INF = 1e18;
struct Edge {
ll v, w;
friend bool operator<(const Edge &a, const Edge &b) {
return a.w > b.w;
}
Edge(ll v_, ll w_) : v(v_), w(w_) {}
};
bool vis[MAXN];
ll dis[MAXN];
priority_queue<Edge> q;
vector<Edge> g[MAXN];
ll n, m, k, s, t, u, v, w, res;
void add(ll u, ll v, ll w) {
g[u].emplace_back(v, w);
}
void dijkstra() {
for (ll i = 1; i <= (k + 1) * n; i++)
dis[i] = INF, vis[i] = false;
dis[s] = 0;
q.emplace(s, 0);
while (!q.empty()) {
ll u = q.top().v;
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (auto &e : g[u]) {
ll v = e.v, w = e.w;
if (dis[v] > dis[u] + w)
dis[v] = dis[u] + w, q.emplace(v, dis[v]);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k >> s >> t;
for (ll i = 1; i <= m; i++) {
cin >> u >> v >> w;
add(u, v, w), add(v, u, w);
for (ll j = 1; j <= k; j++) {
ll uj = u + j * n, vj = v + j * n;
ll uj_1 = u + (j - 1) * n, vj_1 = v + (j - 1) * n;
add(uj, vj, w), add(vj, uj, w);
add(uj_1, vj, 0), add(vj_1, uj, 0);
}
} dijkstra(), res = INF;
for (ll i = 0; i <= k; i++)
res = min(res, dis[t + i * n]);
cout << res << '\n';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...