제출 #1305124

#제출 시각아이디문제언어결과실행 시간메모리
1305124neonglitchEvacuation plan (IZhO18_plan)C++20
100 / 100
501 ms53216 KiB
#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <set> using namespace std; typedef long long ll; const int N=1e5+10; int sp[N],dis[N],ord[N],par[N],ans[N]; vector<pair<int,int>> ma[N]; set<int> qry[N]; int get(int x) { return (par[x]==x)?x:par[x]=get(par[x]); } void merge(int x,int y) { int ox=x,oy=y; x=get(x); y=get(y); if(x==y)return; if(qry[y].size()>qry[x].size())swap(y,x); for(auto j:qry[y]) { if(qry[x].find(j)!=qry[x].end()) { ans[j]=min(dis[ox],dis[oy]); qry[x].erase(j); } else{ qry[x].insert(j); } } par[y]=x; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,m,k; cin>>n>>m; for(int i=0;i<m;i++) { int a,b,w; cin>>a>>b>>w; ma[b].push_back({a,w}); ma[a].push_back({b,w}); } for(int i=1;i<=n;i++) { dis[i]=1e9; } cin>>k; priority_queue<pair<ll,int>,vector<pair<ll,int>> ,greater<pair<ll,int>>>pq; for(int i=0;i<k;i++) { cin>>sp[i]; dis[sp[i]]=0; pq.push({0,sp[i]}); } while(pq.size()>0) { auto it=pq.top(); pq.pop(); ll d=it.first; int x=it.second; if(dis[x]!=d)continue; for(auto [y,w]:ma[x]) { if(dis[y]>d+w) { dis[y]=d+w; pq.push({d+w,y}); } } } for(int i=0;i<n;i++) { ord[i]=i+1; } sort(ord,ord+n,[&](int a,int b){return dis[a]<dis[b];}); reverse(ord,ord+n); int q; cin>>q; for(int j=0;j<q;j++) { int l,r; cin>>l>>r; qry[l].insert(j); qry[r].insert(j); } for(int i=1;i<=n;i++) { par[i]=0; } for(int i=0;i<n;i++) { int x=ord[i]; par[x]=x; for(auto [y,w]:ma[x]) { if(par[y])merge(x,y); } } for(int j=0;j<q;j++) { cout<<ans[j]<<endl; } }
#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...