社区讨论

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 条回复,欢迎继续交流。

正在加载回复...