제출 #1134911

#제출 시각아이디문제언어결과실행 시간메모리
1134911JelalTkmEvacuation plan (IZhO18_plan)C++20
23 / 100
537 ms39552 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O3") #pragma GCC target ("sse4") using namespace std; #define int long long int const int N = 1e5 + 10; const int md = 1e9 + 7; const int INF = 1e18; vector<int> dist(N, INF); class DisjointSets { private: vector<int> p; vector<int> dst; public: DisjointSets(int n) : p(n), dst(n) { for (int i = 0; i < n; i++) { p[i] = i, dst[i] = dist[i];} } int get(int u) { return p[u] = (u == p[u] ? u : get(p[u])); } void unite(int u, int v) { u = get(u); v = get(v); if (u == v) { return; } p[v] = u; dst[u] = min(dst[u], dst[v]); return; } int distance(int u) { u = get(u); return dst[u]; } }; int32_t main(int32_t argc, char *argv[]) { ios::sync_with_stdio(false); cin.tie(nullptr); int T = 1; // cin >> T; while (T--) { int n, m; cin >> n >> m; vector<vector<pair<int, int>>> g(n + 1, vector<pair<int, int>> ()); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; g[u].push_back(make_pair(v, w)); g[v].push_back(make_pair(u, w)); } int k; cin >> k; set<pair<int, int>> q; for (int i = 0; i < k; i++) { int u; cin >> u; dist[u] = 0; q.insert({0, u}); } vector<bool> visited(n + 1); while (!q.empty()) { int v = (*q.begin()).second; q.erase(q.begin()); if (!visited[v]) for (auto i : g[v]) { dist[i.first] = min(dist[i.first], dist[v] + i.second); if (!visited[i.first]) q.insert({dist[i.first], i.first}); } visited[v] = 1; } // for (int i = 1; i <= n; i++) // cout << i << " " << dist[i] << '\n'; int que; cin >> que; vector<vector<pair<int, int>>> qu(n + 1, vector<pair<int, int>> ()); for (int i = 0; i < que; i++) { int u, v; cin >> u >> v; qu[u].push_back(make_pair(v, i)); qu[v].push_back(make_pair(u, i)); } vector<pair<int, int>> dst; for (int i = 1; i <= n; i++) dst.push_back(make_pair(dist[i], i)); sort(dst.rbegin(), dst.rend()); DisjointSets dsu(n + 1); vector<int> ans(que); int ind = 0; vector<bool> vis(n + 1); while (ind < (int) dst.size()) { auto [ds, u] = dst[ind]; vis[u] = 1; for (auto i : g[u]) { if (vis[i.first]) { dsu.unite(i.first, u); } } for (auto i : qu[u]) { if (dsu.get(u) == dsu.get(i.first)) ans[i.second] = dsu.distance(u); } ind++; } for (auto i : ans) cout << i << '\n'; } return 0; }
#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...