代码正确性
查看原帖
代码正确性
815504
chenwenmo楼主2024/11/25 23:52

dl们能不能帮忙看一眼这个代码正不正确,是没有 00 边的部分分代码,虽然已经 7070 了,但是我发现测试点里除了 expected - 还有 expected 其他数。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pli = pair<ll, int>;

const int N = 1e5 + 5, K = 50 + 5;
const ll inf = 1e18;

int n, m;
ll k, mod;
ll dp[N][K];
vector<pair<int, ll>> G[N];
int ord[N], pos[N];
ll dis1[N];
bool vis[N];
priority_queue<pli, vector<pli>, greater<pli>> pq;

void dijkstra(int st, ll *dis) {
    fill(dis + 1, dis + 1 + n, inf);
    fill(vis + 1, vis + 1 + n, false);
    dis[st] = 0;
    pq.emplace(0, st);
    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        if (vis[u]) continue;
        vis[u] = true;
        for (auto e : G[u]) {
            int v = e.first;
            ll w = e.second;
            if (dis[v] > dis[u] + w) {
                dis[v] = dis[u] + w;
                pq.emplace(dis[v], v);
            }
        }
    }
}

bool cmp(int i, int j) { return dis1[i] < dis1[j]; }

void Solve() {
    cin >> n >> m >> k >> mod;
    int u, v; ll w;
    for (int i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        G[u].emplace_back(v, w);
    }
    dijkstra(1, dis1);
    iota(ord + 1, ord + 1 + n, 1);
    sort(ord + 1, ord + 1 + n, cmp);
    for (int i = 1; i <= n; i++) {
        pos[ord[i]] = i;
    }
    sort(dis1 + 1, dis1 + 1 + n);
    dp[1][0] = 1 % mod;
    for (int i = 0; i <= k; i++) {
        for (int j = 1; j <= n; j++) {
            int u = ord[j];
            for (auto e : G[u]) {
                int v = e.first;
                ll w = e.second;
                if (dis1[pos[u]] + i + w - dis1[pos[v]] <= k && dis1[pos[u]] + i + w - dis1[pos[v]] >= 0) {
                    dp[v][dis1[pos[u]] + i + w - dis1[pos[v]]] += dp[u][i];
                    dp[v][dis1[pos[u]] + i + w - dis1[pos[v]]] %= mod;
                }
            }
        }
    }
    ll ans = 0;
    for (int i = 0; i <= k; i++) {
        ans = (ans + dp[n][i]) % mod;
    }
    cout << ans << '\n';
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= n; i++) {
        G[i].clear();
    }
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        Solve();
    }
    return 0;
}
2024/11/25 23:52
加载中...