Submission #1158305

#TimeUsernameProblemLanguageResultExecution timeMemory
1158305SangToll (APIO13_toll)C++20
100 / 100
1051 ms12712 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++) #define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; i--) #define fi first #define se second #define pb push_back #define ALL(a) (a).begin(), (a).end() #define task "kbsiudthw" typedef vector<int> vi; typedef pair<int, int> ii; typedef pair<int, ii> pii; const int N = 1e5 + 5; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 2277; struct DSU{ vi lab; DSU (int n) : lab(n, -1) {}; int Find(int u){ return lab[u] < 0 ? u : lab[u] = Find(lab[u]); } bool join(int u, int v){ if ((u = Find(u)) == (v = Find(v))) return 0; if (lab[u] < lab[v]) swap(u, v); lab[u] += lab[v]; lab[v] = u; return 1; } }; int n, m, k, id[N], mx[N], s[N], total[25], h[25], c[N], P[25]; vector<int> G[25]; void dfs(int u, int par){ s[u] = total[u]; for (int v : G[u]){ if (v == par) continue; h[v] = h[u] + 1; P[v] = u; dfs(v, u); s[u] += s[v]; } } void up(int u, int v, int w){ if (h[u] < h[v]) swap(u, v); while (h[u] > h[v]){ mx[u] = min(mx[u], w); u = P[u]; } while (u != v){ mx[u] = min(mx[u], w); mx[v] = min(mx[v], w); u = P[u]; v = P[v]; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> n >> m >> k; vector<pii> edges; vector<ii> eg; FOR (i, 1, m){ int u, v, w; cin >> u >> v >> w; edges.pb({w, {u, v}}); } sort(ALL(edges)); FOR (i, 1, k){ int u, v; cin >> u >> v; eg.pb({u, v}); } FOR (i, 1, n) cin >> c[i]; DSU dsu(n+5); for (ii &x : eg) dsu.join(x.fi, x.se); vector<bool> marked(m, 0); FOR (i, 0, m - 1){ if (dsu.join(edges[i].se.fi, edges[i].se.se)){ marked[i] = 1; } } dsu = DSU(n+5); FOR (i, 0, m - 1) if (marked[i]) dsu.join(edges[i].se.fi, edges[i].se.se); FOR (i, 1, n){ int x = dsu.Find(i); if (id[x] == 0) id[x] = ++id[0]; id[i] = id[x]; total[id[i]] += c[i]; } dsu = DSU(id[0]+1); vector<pii> mst; for (pii &x : edges){ x.se.fi = id[x.se.fi]; x.se.se = id[x.se.se]; if (dsu.join(x.se.fi, x.se.se)){ mst.pb(x); } } for (ii &x : eg){ x.se = id[x.se]; x.fi = id[x.fi]; } assert(id[1] == 1); assert((int)mst.size() == id[0] - 1); int ans = 0; for (int mask = 0; mask < (1<<k); mask++){ FOR (i, 1, id[0]){ mx[i] = INF; h[i] = 0; G[i].clear(); } bool ok = 1; dsu = DSU(id[0]+1); FOR (i, 0, k - 1){ if ((mask>>i)&1){ if (!dsu.join(eg[i].fi, eg[i].se)) ok = 0; G[eg[i].fi].pb(eg[i].se); G[eg[i].se].pb(eg[i].fi); } } if (!ok) continue; marked.assign(mst.size(), false); FOR (i, 0, (int)mst.size() - 1){ if (dsu.join(mst[i].se.fi, mst[i].se.se)){ marked[i] = 1; G[mst[i].se.fi].pb(mst[i].se.se); G[mst[i].se.se].pb(mst[i].se.fi); } } dfs(1, 0); FOR (i, 0, (int)mst.size() - 1){ if (marked[i]) continue; up(mst[i].se.fi, mst[i].se.se, mst[i].fi); } int res = 0; FOR (i, 0, k - 1){ if ((mask>>i)&1){ int u = eg[i].fi, v = eg[i].se; if (u == P[v]) swap(u, v); assert(mx[u] != INF); res += s[u] * mx[u]; } } ans = max(ans, res); } cout << ans; return 0; }

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:69:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:70:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |         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...