Submission #1351081

#TimeUsernameProblemLanguageResultExecution timeMemory
1351081random_guyyEvacuation plan (IZhO18_plan)C++20
100 / 100
265 ms97208 KiB
#include <bits/stdc++.h>
#define se second
#define fi first
#define pb push_back
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
const int maxn = 1e5+5;
const int mod = 1e9+7;
const ll inf = 4e18;

void read()
{
    #define name "EXIT"
    cin.tie(0)->ios_base::sync_with_stdio(0);cout.tie(0);
    if(fopen(name".INP","r")){
        freopen(name".INP","r",stdin);
        freopen(name".OUT","w",stdout);
    }
}

struct canh{
    ll u,v,w;
};

ll d[maxn],k,par[maxn],sz[maxn],up[maxn][17],minup[maxn][17],h[maxn];
vector<pll> adj[maxn],tree[maxn];
ll m,n;

void dijkstra(vector<int> source)
{
	priority_queue<pll,vector<pll>,greater<pll>> q;
    for(int i=1;i<=n;i++){
        d[i]=inf;
    }
    for(auto &it : source){
        d[it]=0;
        q.push({0,it});
    }
    while(!q.empty()){
        auto [dis,u]=q.top();
        q.pop();
        if(dis!=d[u]) continue;
        for(auto [w,v] : adj[u]){
            if(d[v]>d[u]+w){
                d[v]=d[u]+w;
                q.push({d[v],v});
            }
        }
    }
}

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

bool join_set(int u, int v)
{
    u=find_set(u);v=find_set(v);
    if(u==v)return 0;
    if(sz[v]>sz[u])swap(u,v);
    par[v]=u;
    sz[u]+=sz[v];
    return 1;
}

void dfs(int u)
{
    for(auto [w,v] : tree[u]){
        if(v==up[u][0]) continue;
        h[v]=h[u]+1;
        up[v][0]=u;
        minup[v][0]=w;
        for(int j=1;j<17;j++){
            up[v][j]=up[up[v][j-1]][j-1];
            minup[v][j]=min(minup[v][j-1],minup[up[v][j-1]][j-1]);
        }
        dfs(v);
    }
}

ll lca(int u, int v)
{
    ll res=inf;
    if(h[u]!=h[v]){
        if(h[u]<h[v])swap(u,v);
        int k=h[u]-h[v];
        for(int j=0;j<17;j++){
            if(k>>j&1){
                res=min(res,minup[u][j]);
                u=up[u][j];
            }
        }
    }
    if(u==v)return res;
    for(int j=16;j>=0;j--){
        if(up[u][j]!=up[v][j]){
            res=min(res,minup[u][j]);
            res=min(res,minup[v][j]);
            u=up[u][j];
            v=up[v][j];
        }
    }
    res=min(res,minup[u][0]);
    res=min(res,minup[v][0]);
    return res;
}

signed main()
{
    read();
    cin>>n>>m;
    vector<canh> oldedge,edge;
    for(int i=1,u,w,v;i<=m;i++){
        cin>>u>>v>>w;
        adj[u].pb({w,v});
        adj[v].pb({w,u});
        oldedge.pb({u,v,w});
    }
    int k;
    cin>>k;
    vector<int> bell;
    for(int i=1,x;i<=k;i++){
        cin>>x;
        bell.pb(x);
    }
    dijkstra(bell);
    for(auto [u,v,w] : oldedge){
        edge.pb({u,v,min(d[u],d[v])});
    }
    for(int i=1;i<=n;i++){
        par[i]=i;
        sz[i]=1;
    }
    sort(edge.begin(),edge.end(),[](canh &x, canh &y){
        return x.w>y.w;
    });
    for(auto [u,v,w] : edge){
        if(join_set(u,v)){
            tree[u].pb({w,v});
            tree[v].pb({w,u});
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<17;j++){
            minup[i][j]=inf;
            up[i][j]=0;
        }
    }
    dfs(1);
    int q;
    cin>>q;
    while(q--){
        int u,v;
        cin>>u>>v;
        cout<<lca(u,v)<<"\n";
    }
    return 0;
}

Compilation message (stderr)

plan.cpp: In function 'void read()':
plan.cpp:18:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |         freopen(name".INP","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
plan.cpp:19:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |         freopen(name".OUT","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...