Submission #1162541

#TimeUsernameProblemLanguageResultExecution timeMemory
1162541CrabCNHCities (BOI16_cities)C++20
0 / 100
261 ms46676 KiB
#include <bits/stdc++.h> #define task "BriantheCrab" #define int long long #define pii pair <int, int> #define fi first #define se second #define szf sizeof #define sz(s) (int)((s).size()) using namespace std; template <class T> void mini (T &t, T f) {if (t > f) t = f;} template <class T> void maxi (T &t, T f) {if (t < f) t = f;} const int maxN = 2e5 + 5; const int inf = 1e18 + 7; const int mod = 1e9 + 7; struct Edge { int u, w, s; }; struct cmp { bool operator () (Edge A, Edge B) { return A.w > B.w; } }; struct Path { int u, v, w; }; int n, m, k; int par[maxN], sz[maxN], curS[maxN]; map <pii, int> ck; bool mp[maxN]; vector <int> spe; vector <pii> adj[maxN]; vector <Path> all, nAll; pii L[maxN]; // dis, source bool cmpEdge (Path A, Path B) { return A.w < B.w; } void init () { for (int i = 1; i <= n; i ++) { par[i] = i; sz[i] = 1; curS[i] = mp[i]; } } int getRoot (int u) { if (par[u] == u) { return u; } return (par[u] = getRoot (par[u])); } void merge (int u, int v) { u = getRoot (u); v = getRoot (v); if (u == v) { return; } if (sz[u] < sz[v]) { swap (u, v); } par[v] = u; sz[u] += sz[v]; curS[u] += curS[v]; } void multiSources () { priority_queue <Edge, vector <Edge>, cmp> pq; for (int i = 1; i <= n; i ++) { L[i] = {inf, -1}; } for (auto u : spe) { L[u] = {0, u}; pq.push ({u, L[u].fi, u}); } while (!pq.empty ()) { auto [u, c, source] = pq.top (); pq.pop (); if (c > L[u].fi) { continue; } for (auto [v, dis] : adj[u]) { if (L[v].fi > L[u].fi + dis) { L[v] = {L[u].fi + dis, L[u].se}; pq.push ({v, L[v].fi, L[v].se}); } } } } void solve () { cin >> n >> k >> m; for (int i = 1; i <= k; i ++) { int x; cin >> x; spe.push_back (x); mp[x] = 1; } for (int i = 1; i <= m; i ++) { int u, v, w; cin >> u >> v >> w; if (ck.find ({u, v}) == ck.end ()) { ck[{u, v}] = w; } else { mini (ck[{u, v}], w); } w = ck[{u, v}]; adj[u].push_back ({v, w}); adj[v].push_back ({u, w}); all.push_back ({u, v, w}); } multiSources (); for (auto [u, v, w] : all) { nAll.push_back ({u, L[v].se, w + L[v].fi}); nAll.push_back ({L[u].se, v, L[u].fi + w}); //cout << L[u].se << ' ' << L[v].se << ' ' << L[u].fi + w + L[v].fi << '\n'; } init (); sort (nAll.begin (), nAll.end (), cmpEdge); int cnt = 0, res = 0; //cout << getRoot (1) << ' ' << getRoot (2) << '\n'; for (auto [u, v, w] : nAll) { //cout << u << ' ' << v << ' ' << w << '\n'; if (getRoot (u) == getRoot (v)) { continue; } merge (u, v); res += w; int rt = getRoot (u); if (curS[rt] == k) { break; } } cout << res; return; } signed main () { cin.tie (nullptr) -> sync_with_stdio (false); if (fopen (task".inp", "r")) { freopen (task".inp", "r", stdin); freopen (task".out", "w", stdout); } int t = 1; //cin >> t; while (t --) { solve (); } return 0; } // thfdgb

Compilation message (stderr)

cities.cpp: In function 'int main()':
cities.cpp:152:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  152 |         freopen (task".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
cities.cpp:153:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  153 |         freopen (task".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...