Submission #1204204

#TimeUsernameProblemLanguageResultExecution timeMemory
1204204NewtonabcEvacuation plan (IZhO18_plan)C++20
100 / 100
729 ms72272 KiB
#include<bits/stdc++.h>
#define pli pair<long long,int>
using namespace std;
const int N=1e5+10;
vector<pair<long long,int>> adj[N],t[N];
long long d[N];
int pa[N],dp[N][20],dep[N];
long long mn[N][20];
bool vs[N];
vector<pair<int,int>> etmp;
//edge list
vector<pair<int,pair<int,int>>> e;
priority_queue<pli,vector<pli>,greater<pli>> q;
int root(int x){if(pa[x]==x) return x; return pa[x]=root(pa[x]);}
void dfs(int u,int p){
    dp[u][0]=p;
    mn[u][0]=d[u];
    for(auto [w,v]:t[u]){
        if(v==p) continue;
        dep[v]=dep[u]+1;
        dfs(v,u);
    }
}
int lca(int u,int v){
    long long ret=LLONG_MAX;
    if(dep[u]>dep[v]) swap(u,v);
    for(int i=19;i>=0;i--) if(dep[dp[v][i]]>=dep[u]) ret=min(ret,mn[v][i]),v=dp[v][i];
    //cout<<u <<" " <<v <<" ";
    if(u==v) return min(ret,d[u]);
    for(int i=19;i>=0;i--) if(dp[u][i]!=dp[v][i]) ret=min({ret,mn[u][i],mn[v][i]}),u=dp[u][i],v=dp[v][i];
    return min({ret,d[u],d[v],d[dp[u][0]]});
}
int main(){
    int n,m;
    cin>>n >>m;
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u >>v >>w;
        etmp.push_back({u,v});
        adj[u].push_back({w,v});
        adj[v].push_back({w,u});
    }
    for(int i=1;i<=n;i++) pa[i]=i,d[i]=LLONG_MAX;
    int k;
    cin>>k;
    for(int i=1;i<=k;i++){
        int inp;
        cin>>inp;
        d[inp]=0;
        q.push({0,inp});
    }
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(vs[u]) continue;
        vs[u]=true;
        for(auto [w,v]:adj[u]){
            if(d[u]+w<d[v]){
                d[v]=d[u]+w;
                q.push({d[v],v});
            }
        }
    }
    // for(int i=1;i<=n;i++) cout<<d[i] <<" ";
    // cout<<"\n";
    for(auto [u,v]:etmp) e.push_back({min(d[u],d[v]),{u,v}});
    sort(e.begin(),e.end(),greater<pair<int,pair<int,int>>>());
    for(auto [w,p]:e){
        auto [u,v]=p;
        if(root(u)==root(v)) continue;
        pa[root(u)]=root(v);
        t[u].push_back({w,v});
        t[v].push_back({w,u});
    }
    dfs(1,1);
    // for(int i=1;i<=n;i++) cout<<dep[i] <<" ";
    // cout<<"\n";
    for(int i=1;i<20;i++) for(int j=1;j<=n;j++) dp[j][i]=dp[dp[j][i-1]][i-1],mn[j][i]=min(mn[j][i-1],mn[dp[j][i-1]][i-1]);
    int q;
    cin>>q;
    while(q--){
        int u,v;
        cin>>u >>v;
        cout<<lca(u,v) <<"\n";
    }
}
#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...