제출 #155448

#제출 시각아이디문제언어결과실행 시간메모리
155448srvltEvacuation plan (IZhO18_plan)C++14
100 / 100
742 ms29576 KiB
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse2,avx")
#include <bits/stdc++.h>
#define ll long long
#define db long double
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define fi first
#define se second
#define mp make_pair
#define endl "\n"
//#define int long long
using namespace std;

void dout() {
    cerr << endl;
}

template <typename Head, typename... Tail>
void dout(Head H, Tail... T) {
    cerr << H << ' ';
    dout(T...);
}

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair <int, int> pii;
const int N = 1e5 + 3, M = 5e5 + 3, inf = 1e9;
int n, m, k, queries, d[N], par[N], sz[N];
int ans[M], X;
bool used[N];
vector <pii> q[N], h[N];
vector <int> marked, dsu[N], order;

void dijkstra() {
    set <pii> st;
    for (int i = 1; i <= n; i++) {
        d[i] = inf;
    }
    for (auto i : marked) {
        d[i] = 0;
        st.insert({0, i});
    }
    while (!st.empty()) {
        pii z = *st.begin();
        st.erase(z);
        int v = z.se;
        for (auto i : q[v]) {
            int to = i.fi, w = i.se;
            if (d[to] > d[v] + w) {
                st.erase({d[to], to});
                d[to] = d[v] + w;
                st.insert({d[to], to});
            }
        }
    }
}

void make_set(int x) {
    dsu[x] = {x};
    par[x] = x;
    sz[x] = 1;
}

int find_set(int x) {
    if (x == par[x]) {
        return x;
    }
    return par[x] = find_set(par[x]);
}

void union_set(int x, int y) {
    int tx = x, ty = y;
    x = find_set(x);
    y = find_set(y);
    if (x == y) {
        return;
    }
    if (sz[x] < sz[y]) {
        swap(x, y);
    }
    par[y] = x;
    sz[x] += sz[y];
    for (auto i : dsu[y]) {
        for (auto j : h[i]) {
            if (find_set(j.fi) == x && d[j.fi] >= X) {
                ans[j.se] = max(ans[j.se], X);
            }
        }
        dsu[x].pb(i);
    }
}

bool cmp(int x, int y) {
    return d[x] > d[y];
}

void solve(int tc) {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        q[x].pb({y, z});
        q[y].pb({x, z});
    }
    cin >> k;
    for (int i = 1; i <= k; i++) {
        int x;
        cin >> x;
        marked.pb(x);
    }
    dijkstra();
    cin >> queries;
    for (int i = 1; i <= queries; i++) {
        int x, y;
        cin >> x >> y;
        h[x].pb({y, i});
        h[y].pb({x, i});
    }
    for (int i = 1; i <= n; i++) {
        make_set(i);
        order.pb(i);
    }
    sort(order.begin(), order.end(), cmp);
    for (auto i : order) {
        X = d[i];
        used[i] = true;
        for (auto j : q[i]) {
            if (used[j.fi]) {
                union_set(i, j.fi);
            }
        }
    }
    for (int i = 1; i <= queries; i++) {
        cout << ans[i] << endl;
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int tc = 1;
//    cin >> tc;
    for (int i = 0; i < tc; i++) {
        solve(i);
//        cleanup();
    }
}

컴파일 시 표준 에러 (stderr) 메시지

plan.cpp: In function 'void union_set(int, int)':
plan.cpp:74:9: warning: unused variable 'tx' [-Wunused-variable]
     int tx = x, ty = y;
         ^~
plan.cpp:74:17: warning: unused variable 'ty' [-Wunused-variable]
     int tx = x, ty = y;
                 ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...