제출 #1299482

#제출 시각아이디문제언어결과실행 시간메모리
1299482islam_555111Evacuation plan (IZhO18_plan)C++20
100 / 100
676 ms58040 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=1e5+10;
const ll INF=1e15;
#define F first
#define S second
vector<pair<ll,ll>>g[N];
ll d[N];
ll p[N],sz[N];
ll get(ll v){
    if(v==p[v])return v ;
     return p[v]=get(p[v]);
}
void alpha(ll v, ll u) {
    v=get(v);
    u=get(u);
    if (u==v) return;
    if (sz[u]<sz[v])swap(u,v);
    p[v]=u;
    sz[u]+=sz[v];
    return;
}
ll used[N];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        d[i]=INF;
    }
    ll u[m+1],v[m+1],w[m+1];
    for(int i=1;i<=m;i++){
        cin>>u[i]>>v[i]>>w[i];
        g[u[i]].push_back({v[i],w[i]});
        g[v[i]].push_back({u[i],w[i]});
    }
    ll k;
    cin>>k;
    set<pair<ll,ll>>st;
    
    for(int i=1;i<=k;i++){
        ll x;
        cin>>x;
        d[x]=0;
        st.insert({0,x});
    }
    
    while(st.size()>0){
        auto CUR=st.begin();
        pair<ll,ll>cur=*CUR;
            st.erase(st.begin());
            if(cur.F>d[cur.S])continue;
        for(auto to : g[cur.S]){
            if(d[to.first]>d[cur.S]+to.second){
                d[to.first]=d[cur.S]+to.second;
                st.insert({d[cur.S]+to.second,to.first});
            }
        }
    }

    vector<pair<ll,ll>>VEC;
    for(int i=1;i<=n;i++){
        VEC.push_back({d[i],i});
    }
    for(int i=1;i<=n;i++){
        sz[i]=1;
        p[i]=i;
    }
    sort(VEC.begin(),VEC.end());
    ll q;
    cin>>q;
    ll s[q+1],t[q+1],l[q+1],r[q+1],mid[q+1];
    for(int i=1;i<=q;i++){
        cin>>s[i]>>t[i];
        l[i]=1;
        r[i]=n;
    }
    ll ans[q+1];
    while(true){
        for(int i=1;i<=n;i++){
            p[i]=i;
            used[i]=0;
            sz[i]=1;
        }
        vector<ll>vec[n+1];
        for(int i=1;i<=n;i++)vec[i].clear();
        ll ok=1;
        for(int i=1;i<=q;i++){
            if(r[i]>=l[i])ok=0;
            mid[i]=(l[i]+r[i])>>1;
            vec[mid[i]].push_back(i);
        }
        if(ok)break;
        for(int i=n;i>=1;i--){
            used[VEC[i-1].second]=1;
            for(auto to : g[VEC[i-1].second]){
                if(used[to.first])alpha(to.first,VEC[i-1].second);
            }
             for(auto j : vec[i]){
                if(get(s[j])==get(t[j])){
                    ans[j]=VEC[i-1].first;
                    l[j]=mid[j]+1;
                }
                else {
                    r[j]=mid[j]-1;
                }
             }
        }
    }
    for(int i=1;i<=q;i++){
        cout<<ans[i]<<' ';
    }
}
#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...