wa60壶关求解
查看原帖
wa60壶关求解
1612100
封禁用户楼主2025/8/2 15:27
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define pb push_back
const int N = 1e5 + 5;
int n, m, s, ed, T;
int head[N], dis[N];
bool vis[N];
struct node {
    int to;
    int nex;
    int val;
} e[N * 2];
int cnt = 0;

void add(int u, int v, int w) {
    e[++cnt] = {v, head[u], w};
    head[u] = cnt;
    e[++cnt] = {u, head[v], w};
    head[v] = cnt;
}

struct node2 {
    int d;
    int x;
    bool operator < (const node2 &a) const {
        return d > a.d;
    }
};

void dijkstra(int a) {
    fill(dis + 1, dis + n + 1, LLONG_MAX);
    dis[a] = 0;
    priority_queue<node2> q;
    q.push({0, a});
    while (!q.empty()) {
        int x = q.top().x;
        q.pop();
        if (vis[x]) continue;
        vis[x] = 1;
        for (int i = head[x]; i; i = e[i].nex) {
            int v = e[i].to, w = e[i].val;
            if (dis[v] > dis[x] + w) {
                dis[v] = dis[x] + w;
                q.push({dis[v], v});
            }
        }
    }
}

struct node3 {
    int time;
    int pos;
    bool operator < (const node3 &a) const {
        return time < a.time;
    }
} mv[N];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m >> s >> ed;
    for (int i = 1; i <= m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        add(u, v, w);
    }
    cin >> T;
    for (int i = 1; i <= T; i++) {
        cin >> mv[i].time >> mv[i].pos;
    }
    sort(mv + 1, mv + T + 1);

    dijkstra(s);

    int ans = LLONG_MAX;

    for (int i = 1; i <= T; i++) {
        int t = mv[i].time;
        int pos = mv[i].pos;
        if (dis[pos] <= t) {
            ans = min(ans, t);
        } else if (i < T && dis[pos] < mv[i + 1].time) {
            ans = min(ans, dis[pos]);
        }
    }

    if (ans == LLONG_MAX) {
        ans = dis[ed];
    }

    cout << ans;
    return 0;
}
2025/8/2 15:27
加载中...