Submission #844065

#TimeUsernameProblemLanguageResultExecution timeMemory
844065Darren0724Evacuation plan (IZhO18_plan)C++17
31 / 100
701 ms51628 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100005; const int INF = 1e9; vector<pair<int, int>> adj[N]; struct info { int a, b, l, m, r, id; }; bool operator<(info &a, info &b) { return make_pair(a.m, a.id) > make_pair(b.m, b.id); } struct DSU { vector<int> pa, sz; DSU(int n) { pa.resize(n); sz.resize(n, 1); iota(pa.begin(), pa.end(), 0); } int Find(int k) { if (k == pa[k]) { return k; } return pa[k]=Find(pa[k]); } void onion(int a,int b){ a=Find(a),b=Find(b); if(a==b){ return; } if(sz[a]>sz[b]){ swap(a,b); } pa[a]=b; sz[b]+=sz[a]; } }; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; adj[a].push_back({b, c}); adj[b].push_back({a, c}); } vector<int> dis(N, INF); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; int shaoji; cin >> shaoji; for (int i = 0; i < shaoji; i++) { int k; cin >> k; dis[k] = 0; pq.push({0, k}); } while (pq.size()) { int a, b; tie(a, b) = pq.top(); pq.pop(); if (a != dis[b]) { continue; } for (auto &e : adj[b]) { if (dis[e.first] > a + e.second) { dis[e.first] = a + e.second; pq.push({dis[e.first], e.first}); } } } vector<info> v; for (int i = 1; i <= n; i++) { for (auto &e : adj[i]) { if (dis[i] < dis[e.first]) { v.push_back({i, e.first, 0, dis[i], 0, INF}); } } } int q; cin >> q; vector<int> ans(q); int solved = 0; for (int i = 0; i < q; i++) { int a, b; cin >> a >> b; int c = INF / 2; v.push_back({a, b, 0, c, INF, i}); } sort(v.begin(), v.end()); vector<info> v1; while (solved != q) { int sz=v.size(); DSU d(n+1); for(int i=0;i<sz;i++){ //cout<<v[i].m<<' '; if(v[i].id==INF){ d.onion(v[i].a,v[i].b); v1.push_back(v[i]); } else{ if(d.Find(v[i].a)==d.Find(v[i].b)){ v[i].l=v[i].m; } else{ v[i].r=v[i].m; } if(v[i].r-v[i].l==1){ ans[v[i].id]=v[i].l; solved++; } else{ v[i].m=(v[i].l+v[i].r)/2; v1.push_back(v[i]); } } } //cout<<endl; v=v1; v1.clear(); sort(v.begin(),v.end()); } for(int i=0;i<q;i++){ cout<<ans[i]<<'\n'; } return 0; } /* 9 12 1 9 4 1 2 5 2 3 7 2 4 3 4 3 6 3 6 4 8 7 10 6 7 5 5 8 1 9 5 7 5 4 12 6 8 2 2 4 7 5 1 6 5 3 4 8 5 8 1 5 */
#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...