Submission #893043

#TimeUsernameProblemLanguageResultExecution timeMemory
893043vjudge1Evacuation plan (IZhO18_plan)C++17
29 / 100
4073 ms72760 KiB
// 以上帝的名义 // 候选硕士 #include <bits/stdc++.h> #ifdef local #include "algo/debug.h" #else #define dbg(x...) 0 #endif using namespace std ; using ll = long long ; #define int ll template<class T> constexpr T inf = ::numeric_limits<T>::max() / 32 * 15 + 208; const int N = 1e6 + 5 ; int n , m , k , city[N] ; ll dist[N], pr[N] ; vector<pair<ll,int>> g[N] ; void djickstra() { for (int i = 1 ; i <= n ; i++) { dist[i] = inf<ll> ; } set<pair<ll,int>> st; for (int i = 0 ; i < k ; i++) { st.insert({0, city[i]}) ; dist[city[i]] = 0 ; } while (st.size()) { auto [val, v] = *st.begin() ; st.erase(st.begin()) ; for (auto [w, to] : g[v]) { if (dist[to] > dist[v] + w) { st.erase({dist[to], to}) ; dist[to] = dist[v] + w ; st.insert({dist[to], to}) ; } } } } struct DSU { vector<int> parent, sz ; DSU(int n) { parent.resize(n) ; iota(begin(parent), end(parent), 0) ; sz.assign(n, 1) ; } int find(int i) { if (i == parent[i]) { return i ; } else { return parent[i] = find(parent[i]) ; } } bool unite(int u, int v) { u = find(u), v = find(v) ; if (u == v) return false ; if (sz[v] == sz[u]) sz[v]++ ; if (sz[v] < sz[u]) swap(u, v) ; parent[u] = v ; return true ; } bool same(int u, int v) { return (find(u) == find(v)) ; } }; int32_t main() { cin.tie(0)->sync_with_stdio(false) ; cin >> n >> m ; vector<tuple<ll,ll,ll>> edge(m) ; for (int i = 0 ; i < m ; i++) { ll u , v , w ; cin >> u >> v >> w ; g[u].push_back({w, v}) ; g[v].push_back({w, u}) ; edge[i] = {0, u, v} ; } cin >> k ; for (int i = 0 ; i < k ; i++) { cin >> city[i] ; } djickstra() ; for (int i = 0 ; i < m ; i++) { auto& [val, u, v] = edge[i] ; val = min(dist[u], dist[v]) ; } int q ; cin >> q ; set<tuple<int,int,int>> query ; for (int i = 0 ; i < q; i++) { int u , v ; cin >> u >> v ; query.insert({u, v, i}) ; } vector<ll> ans(q) ; sort(edge.rbegin(), edge.rend()) ; DSU d(n + 1) ; for (auto [val, u, v] : edge) { if (query.empty()) break ; if (d.unite(u, v)) { for (auto it = query.begin() ; query.size() && it != query.end() ; it++) { auto [A, B, i] = *it ; if (d.same(A, B)) { ans[i] = val ; if (query.size() == 1) { query.erase(query.begin()) ; } else it = query.erase(it) ; } } } } for (ll 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...