为什么第一个点会WA……
#include <bits/stdc++.h>
using namespace std;
const int N = 110, M = 110;
bool cant[M][N][N], closed[M][N], vis[M];
struct edge_t
{
int to, nxt, val;
} edge[2 * N * N];
int head[N], tot = 0;
long long dist[M][M][N], cost[M][M];
long long dp[M];
int n, m, k, e, d;
void add(int u, int v, int w)
{
edge[tot] = {v, head[u], w}, head[u] = tot++;
edge[tot] = {u, head[v], w}, head[v] = tot++;
}
void spfa(int a, int b)
{
memset(vis, false, sizeof(vis));
dist[a][b][1] = 0;
queue<int> q;
q.push(1);
vis[1] = true;
while (!q.empty())
{
int p = q.front();
q.pop();
vis[p] = false;
for (int ed = head[p]; ed != -1; ed = edge[ed].nxt)
{
int to = edge[ed].to, val = edge[ed].val;
if (cant[to][a][b])
continue;
if (dist[a][b][to] > dist[a][b][p] + val)
{
dist[a][b][to] = dist[a][b][p] + val;
if (!vis[to])
q.push(to), vis[to] = true;
}
}
}
}
int main()
{
memset(head, -1, sizeof(head));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
dist[i][j][k] = 1e8;
scanf("%d%d%d%d", &n, &m, &k, &e);
for (int i = 0; i < e; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
scanf("%d", &d);
for (int i = 0; i < d; i++)
{
int p, a, b;
scanf("%d%d%d", &p, &a, &b);
for (int j = a; j <= b; j++)
closed[p][j] = true;
}
bool flag;
for (int p = 1; p <= n; p++)
for (int i = 1; i <= n; i++)
{
flag = false;
for (int j = i; j <= n; j++)
{
if (closed[p][j])
flag = true;
if (flag)
cant[p][i][j] = true;
}
}
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
spfa(i, j), cost[i][j] = dist[i][j][m];
memset(dp, 0x7f, sizeof(dp));
for (int i = 1; i <= n; i++)
{
dp[i] = cost[1][i] * i;
for (int j = i - 1; j >= 0; j--)
dp[i] = min(dp[i], dp[j] + cost[j + 1][i] * (i - j) + k);
}
printf("%d", dp[n]);
return 0;
}