dl们能不能帮忙看一眼这个代码正不正确,是没有 0 边的部分分代码,虽然已经 70 了,但是我发现测试点里除了 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;
}