Submission #1326902

#TimeUsernameProblemLanguageResultExecution timeMemory
1326902bearrbearrEvacuation plan (IZhO18_plan)C++20
100 / 100
491 ms49988 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
const int maxn=1e5+2;
vector<ii>adj[maxn];

int n,m,dist[maxn],dsu[maxn],ans[maxn],cost;
map<int,int>mp[maxn];

int fin(int a){
    if(dsu[a]==a)return a;
    return dsu[a]=fin(dsu[a]);
}

void merg(int a,int b){
    a=fin(a),b=fin(b);
    if(a==b)return;
    if(mp[a].size()>mp[b].size())swap(a,b);

    dsu[a]=b;
    for(auto [id,brp] : mp[a]){
        mp[b][id]+=brp;
        if(mp[b][id]==2){
            ans[id]=max(ans[id],cost);
        }
    }
    mp[a].clear();
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int q=1;q<=m;q++){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].pb({v,w});
        adj[v].pb({u,w});
    }
    for(int q=1;q<=n;q++){
        dist[q]=1e18; dsu[q]=q;
    }
    int slh; cin>>slh;
    priority_queue<ii,vector<ii>,greater<ii> >pq;

    for(int q=1;q<=slh;q++){
        int a; cin>>a;
        dist[a]=0;
        pq.push({0,a});
    }
    while(pq.size()){
        auto[jrk,u]=pq.top();
        pq.pop();
        if(dist[u]!=jrk)continue;
        for(auto [x,w] : adj[u]){
            if(dist[x]>jrk+w){
                dist[x]=jrk+w;
                pq.push({dist[x],x});
            }
        }
    }
    
    vector<ii>apa;
    for(int q=1;q<=n;q++)apa.pb({dist[q],q});
    sort(apa.begin(),apa.end());

    int qu;cin>>qu;
    for(int q=1;q<=qu;q++){
        int u,v; cin>>u>>v;
        mp[u][q]++; mp[v][q]++;
    }

    while(apa.size()){
        auto [jrk,_]=apa.back();
        cost=jrk;

        while(apa.size() && apa.back().first==cost){
            auto[hmm,id]=apa.back(); apa.pop_back();
            for(auto [x,w] : adj[id]){
                if(dist[x]>=cost){
                    merg(x,id);
                }
            }
        }
    }

    for(int q=1;q<=qu;q++){
        cout<<ans[q]<<endl;
    }

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