HOW E(悬棺
  • 板块学术版
  • 楼主sunlewen
  • 当前回复10
  • 已保存回复10
  • 发布时间2025/7/27 13:04
  • 上次更新2025/7/27 19:27:52
查看原帖
HOW E(悬棺
686156
sunlewen楼主2025/7/27 13:04
#include <bits/stdc++.h>
using namespace std;

const int N = 505, inf = 0x3f3f3f3f;
int n, m, k, t, q;
int d[N][N];

int main() {
    cin >> n >> m;
    memset(d, inf, sizeof(d));
    for(int i = 1; i <= m; i++) {
        int a, b, c; cin >> a >> b >> c;
        d[a][b] = d[b][a] = c;
    }
    cin >> k >> t;
    for(int i = 1; i <= k; i++) {
        int a; cin >> a;
        d[a][0] = t; d[0][a] = 0;
    }
    for(int i = 1; i <= n; i++) d[i][i] = 0;
    for(int l = 0; l <= n; l++)
        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= n; j++)
                if(l != i && l != j && d[i][l] != inf && d[l][j] != inf) d[i][j] = min(d[i][j], d[i][l] + d[l][j]);
    cin >> q;
    for(int i = 1; i <= q; i++) {
        int opt; cin >> opt;
        if(opt == 1) {
            int a, b, c; cin >> a >> b >> c;
            if(d[a][b] <= c) continue;
            d[a][b] = d[b][a] = c;
            for(int j = 0; j <= n; j++)
                for(int l = 0; l <= n; l++)
                    d[j][l] = min(d[j][l], min(d[j][a] + c + d[b][l], d[j][b] + c + d[a][l]));
        } else if(opt == 2) {
            int a; cin >> a;
            d[a][0] = t; d[0][a] = 0;
            for(int j = 0; j <= n; j++)
                for(int l = 0; l <= n; l++)
                    d[j][l] = min(d[j][l], min(d[j][a] + t + d[0][l], d[j][0] + 0 + d[a][l]));
        } else {
            long long ans = 0;
            for(int j = 1; j <= n; j++)
                for(int l = 1; l <= n; l++)
                    ans += ((d[j][l] == inf || j == l)? 0: d[j][l]);
            cout << ans << endl;
        }
    }
    return 0;
}

WHY WA? https://atcoder.jp/contests/abc416/submissions/67986802

2025/7/27 13:04
加载中...