rt,样例能过,一直WA,求条
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7f7f;
const int maxn = 105;
int n, m, k, e, p, a, b;
int w[maxn][maxn], cost[maxn][maxn], dis[maxn], dp[maxn];
bool vis[maxn],use[maxn][maxn];
queue<int> q;
void spfa(int l, int r) {
while (!q.empty()) q.pop();
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= m; i++) {
dis[i] = (i == 1 ? 0 : inf);
if (i == 1) {
q.push(i);
vis[i] = true;
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;
for (int v = 1; v <= m; v++) {
if (use[v][r] || use[v][l]) continue;
if (dis[v] > dis[u] + w[u][v]) {
dis[v] = dis[u] + w[u][v];
if (!vis[v]) {
q.push(v);
vis[v] = true;
}
}
}
}
if (dis[m] == inf) cost[l][r] = inf;
else cost[l][r] = dis[m] * (r - l + 1);
}
int main() {
scanf("%d%d%d%d", &n, &m, &k, &e);
memset(w, inf, sizeof(w));
memset(cost, inf, sizeof(cost));
for (int i = 1; i <= e; i++) {
int u, v, d;
scanf("%d%d%d", &u, &v, &d);
w[u][v] = min(w[u][v], d);
w[v][u] = min(w[v][u], d);
}
scanf("%d", &p);
for (int i = 1; i <= p; i++) {
int d;
scanf("%d%d%d", &d, &a, &b);
for (int j = a; j <= b; j++) use[d][j] = true;
}
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
spfa(i, j);
memset(dp, inf, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j < i; j++)
if (cost[j + 1][i] != inf)
dp[i] = min(dp[i], dp[j] + cost[j + 1][i] + k);
printf("%d\n", dp[n] - k);
return 0;
}