Submission #1266853

#TimeUsernameProblemLanguageResultExecution timeMemory
1266853trinm01Evacuation plan (IZhO18_plan)C++20
0 / 100
169 ms76816 KiB
// #pragma GCC optimize("O3")
// #pragma GCC optimization("Ofast,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define ll long long
#define FOR(i, l, r) for (int i = (l); i <= (r); i++)
#define FOD(i, r, l) for (int i = (r); i >= (l); i--)
#define fi first
#define se second
#define pii pair<int, int>

const ll mod = 1e9 + 7;
const int MAXN = 5e5 + 5;
const ll oo = 1e18+7;  
const int base = 10;

int n, m, q, k;
int a[MAXN];
vector<pii> adj[MAXN];

int f[MAXN];
void dijsktra(){
    priority_queue<pii, vector<pii>, greater<pii>> q;
    FOR(i, 1, n){
        f[i]=oo;
    }
    FOR(i, 1, k){
        f[a[i]]=0;
        q.push({0, a[i]});
    }
    while(!q.empty()){
        auto [c, u]=q.top();
        q.pop();
        if(c>f[u]) continue;
        for(auto [v, w]:adj[u]){
            if(f[v]>f[u]+w){
                f[v]=f[u]+w;
                q.push({f[v], v});
            }
        }
    }
}

struct edge{
    int u, v, c;
}cc[MAXN];
bool cmp(edge a, edge b){
    return a.c<b.c;
}

int par[MAXN];
int find(int u){
    if(par[u]==u){
        return u;
    }
    return par[u]=find(par[u]);
}
int join(int u, int v){
    u=find(u);
    v=find(v);
    if(u==v){
        return 0;
    }
    par[v]=u;
    return 1;
}

vector<pii> adj1[MAXN];

int up[MAXN][20], st[MAXN][20], h[MAXN];
void dfs(int u, int p){
    for(auto [v, w]:adj1[u]){
        if(v==p) continue;
        h[v]=h[u]+1;
        up[v][0]=u;
        FOR(i, 1, 19){
            up[v][i]=up[up[v][i-1]][i-1];
        }
        st[v][0]=w;
        FOR(i, 1, 19){
            st[v][i]=min(st[v][i-1], st[up[v][i-1]][i-1]);
        }
        dfs(v, u);
    }
}
int get(int u, int v){
    int ans=oo;
    if(h[u]!=h[v]){
        if(h[u]<h[v]){
            swap(u, v);
        }
        int k=(h[u]-h[v]);
        FOR(i, 1, 19){
            if((k>>i)&1){
                ans=min(ans, st[u][i]);
                u=up[u][i];
            }
        }
    }
    if(u==v){
        return ans;
    }
    FOD(i, 19, 0){
        if(up[u][i]!=up[v][i]){
            ans=min({ans, st[u][i], st[v][i]});
            u=up[u][i];
            v=up[v][i];
        }
    }
    return min({ans, st[u][0], st[v][0]});
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    if(fopen(".inp", "r")){
        freopen(".inp", "r", stdin);
        freopen(".out", "w", stdout);
    }   

    cin >> n >> m;
    FOR(i, 1, m){
        int u, v, c;
        cin >> u >> v >> c;
        adj[u].push_back({v, c});
        adj[v].push_back({u, c});
        cc[i]={u, v, 0};
    }
    cin >> k;
    FOR(i, 1, k){
        cin >> a[i];
    }
    
    dijsktra();

    // FOR(i, 1, n){
    //     cout << f[i] << ' ';
    // }
    // cout << '\n';

    FOR(i, 1, m){
        auto [u, v, c]=cc[i];
        cc[i].c=min(f[u], f[v]);
    }
    sort(cc+1, cc+1+m, cmp);
    reverse(cc+1, cc+1+m);

    FOR(i, 1, n){
        par[i]=i;
    }
    FOR(i, 1, m){
        auto [u, v, c]=cc[i];
        if(join(u, v)){
            adj1[u].push_back({v, c});
            adj1[v].push_back({u, c});
            // cout << u << ' ' << v << ' ' << c << '\n';
        }
    }
    FOR(i, 0, n+2){
        FOR(j, 0, 19){
            st[i][j]=oo;
        }
    }
    dfs(1, 0);

    cin >> q;
    FOR(i, 1, q){
        int u, v;
        cin >> u >> v;
        if(u==v){
            cout << 0 << '\n';
            continue;
        }
        cout << get(u, v) << '\n';
    }
    
    return 0;
}

Compilation message (stderr)

plan.cpp: In function 'int main()':
plan.cpp:122:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
plan.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(".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...