제출 #1127381

#제출 시각아이디문제언어결과실행 시간메모리
1127381LuvidiEvacuation plan (IZhO18_plan)C++20
41 / 100
4094 ms26644 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll, ll> #define pii pair<int, int> #define fs first #define sc second #define pb push_back const int maxn=1e5; vector<pii> adj[maxn+1]; int par[maxn+1],ls,ans[maxn+1]; bool en[maxn+1]; set<int> s[maxn+1]; int rep(int x){ if(x==par[x])return x; return par[x]=rep(par[x]); } void join(int x,int y){ x=rep(x);y=rep(y); if(x==y)return; if(s[x]>s[y])swap(x,y); par[x]=y; for(int i:s[x]){ if(s[y].count(i))ans[i]=ls; else s[y].insert(i); } s[x].clear(); } void solve() { int n,m; cin>>n>>m; while(m--){ int u,v,w; cin>>u>>v>>w; adj[u].pb({v,w}); adj[v].pb({u,w}); } bool vis[n+1]; pii d[n+1]; priority_queue<pii> pq; for(int i=1;i<=n;i++){ d[i]={1e9,i}; vis[i]=0; } int k; cin>>k; while(k--){ int x; cin>>x; d[x].fs=0; pq.push({0,x}); } while(!pq.empty()){ int v=pq.top().sc; pq.pop(); if(vis[v])continue; vis[v]=1; for(auto[u,w]:adj[v])if(!vis[u]){ d[u].fs=min(d[u].fs,d[v].fs+w); pq.push({-d[u].fs,u}); } } int q; cin>>q; for(int i=0;i<q;i++){ int u,v; cin>>u>>v; s[u].insert(i); s[v].insert(i); } iota(par+1,par+n+1,1); sort(d+1,d+n+1); reverse(d+1,d+n+1); for(int i=1;i<=n;i++){ auto[ds,v]=d[i]; ls=ds; en[v]=1; for(auto[u,w]:adj[v])if(en[u])join(u,v); } for(int i=0;i<q;i++)cout<<ans[i]<<'\n'; } int main() { #ifdef FPO freopen("in","r",stdin); freopen("out","w",stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); }
#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...