社区讨论
TLE求条
P9751[CSP-J 2023] 旅游巴士参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj1eubid
- 此快照首次捕获于
- 2025/12/11 20:24 2 个月前
- 此快照最后确认于
- 2025/12/13 19:30 2 个月前
代码如下
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
#define pii pair <int, int>
#define mk make_pair
#define ps push
int n, m, k;
struct way {
int to, w;
};
vector <way> G[N];
int dis[N][110];
/*
dis[i][j] 表示到达i这个位置,时刻%k后是j
*/
void dij () {
for (int i = 1; i <= n; i++) {
for (int j = 0; j < k; j++) {
dis[i][j] = INT_MAX;
}
}
dis[1][0] = 0;
priority_queue <pii, vector <pii>, greater <pii> > q;
q.ps (mk (0, 1));
while (!q.empty ()) {
auto [z, u] = q.top (); q.pop ();
for (auto [v, w] : G[u]) {
for (int i = 0; i < k; i++) {
if (dis[u][i] == INT_MAX) continue;
if (dis[u][i] >= w) {
if (dis[v][(i + 1) % k] < dis[u][i] + 1) continue;
dis[v][(i + 1) % k] = dis[u][i] + 1;
q.ps (mk (dis[v][(i + 1) % k], v));
} else {
if (dis[v][(i + 1) % k] < dis[u][i] + ceil ((w - dis[u][i]) * 1.0 / k) * k + 1) continue;
dis[v][(i + 1) % k] = dis[u][i] + ceil ((w - dis[u][i]) * 1.0 / k) * k + 1;
q.ps (mk (dis[v][(i + 1) % k], v));
}
}
}
}
if (dis[n][0] == INT_MAX) dis[n][0] = -1;
cout << dis[n][0] << "\n";
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= m; i++) {
int u, v, w; cin >> u >> v >> w;
G[u].push_back ({v, w});
}
dij ();
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...