Submission #495132

#TimeUsernameProblemLanguageResultExecution timeMemory
495132NalrimetEvacuation plan (IZhO18_plan)C++17
54 / 100
457 ms19264 KiB
#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;
const int inf = 1000000000;

#define F first
#define S second
#define pb push_back

vector<pair<int, int>> g[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
priority_queue<pair<int, int>> q1;
int n, m, d[N], p[N], k, qq;
bool used[N];

int ans(int s, int t){
    int res = min(d[s], d[t]);
    q1.push({d[s], s});
    while(!q1.empty()){
        if(used[t]) break;
        int v = q1.top().S;
        int d_v = q1.top().F;
//        cout << v << ' ' << d_v << '\n';
        q1.pop();
        res = min(res, d_v);
        for(auto edge : g[v]){
            int to = edge.F;
            if(!used[to]){
                q1.push({d[to], to});
                used[to] = 1;
            }
        }
    }
    while(!q1.empty()){
        q1.pop();
    }
    for(int i = 1; i <= n; ++i){
        used[i] = 0;
    }
    return res;
}

int main() {

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;

    for(int i = 1, a, b, w; i <= m; ++i){
        cin >> a >> b >> w;
        g[a].pb({b, w});
        g[b].pb({a, w});
    }

    for(int i = 1; i <= n; ++i){
        d[i] = inf;
    }

    cin >> k;

    for(int i = 1, x; i <= k; ++i){
        cin >> x;
        d[x] = 0;
        q.push({0, x});
    }

    while(!q.empty()){
        int v = q.top().S;
        int d_v = q.top().F;
        q.pop();
        if(d_v != d[v]) continue;
        for(auto edge : g[v]){
            int to = edge.F;
            int len = edge.S;
            if(d[v] + len < d[to]){
                d[to] = d[v] + len;
                q.push({d[to], to});
            }
        }
    }

//    for(int i = 1; i <= n; ++i){
//        cout << d[i] << ' ';
//    }

    cin >> qq;

    if(qq == 1 || (qq <= 200 && n <= 15 && m <= 200)){
        while(qq--){
            int s, t;
            cin >> s >> t;
            cout << ans(s, t) << '\n';
        }
    }
    else{
        while(qq--){
            int s, t;
            cin >> s >> t;
            cout << min(d[s], d[t]) << '\n';
        }
    }

    return 0;

}
#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...