20pts求助
查看原帖
20pts求助
1076440
Kano_zyc楼主2023/12/5 20:14

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;
}
2023/12/5 20:14
加载中...