0pts玄关求调(floyd+邻接矩阵)
查看原帖
0pts玄关求调(floyd+邻接矩阵)
1466830
RoyalCookie楼主2025/8/4 11:53
#include <bits/stdc++.h>
using namespace std;
#define AC ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long ll;
const int N = 205;
int n, m, d[N][N], Q, tme[N];
void folyd (int k) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            d[i][j] = min (d[i][j], d[i][k] + d[k][j]);
        }
    }
} 
struct node {
    int t, id, a, b, op;
    bool friend operator < (node a, node b) {
        if (a.t == b.t) {
            return a.op < b.op;
        }
        return a.t < b.t;
    }
} village[60002];
signed main () {
    AC;
    cin >> n >> m;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            d[i][j] = 1e9;
        }
    }
    for (int i = 0; i < n; i++) {
        d[i][i] = 0;
    }
    for (int i = 0; i < n; i++) {
        cin >> village[i].t;
        village[i].id = i;
        village[i].op = 0;
        tme[i] = village[i].t;
    }
    for (int i = 0; i < m; i++) {
        int x, y, w;
        cin >> x >> y >> w;
        d[x][y] = d[y][x] = min (d[x][y], w);
    }
    cin >> Q;
    for (int i = n; i < Q + n; i++) {
        cin >> village[i].a >> village[i].b >> village[i].t;
        village[i].op = 1;
    }
    sort (village, village + n + Q);
    for (int i = 0; i < n + Q; i++) {
        if (village[i].op == 0) {
            folyd(village[i].id);
        }
        else {
            if (village[i].t < tme[village[i].a] || village[i].t < tme[village[i].b] || d[village[i].a][village[i].b] >= 1e9) {
                cout << -1 << endl;
            }
            else {
                cout << d[village[i].a][village[i].b] << endl;
            }
        }
    }
    return 0;
}
2025/8/4 11:53
加载中...