제출 #1165811

#제출 시각아이디문제언어결과실행 시간메모리
1165811MuhammetToll (APIO13_toll)C++20
0 / 100
2595 ms324 KiB
#include "bits/stdc++.h" using namespace std; #define ff first #define ss second #define ll long long ll n, m, k, an; vector <int> p, a, h; vector <vector <pair <int, int>>> v; vector <pair <int, int>> blue; void clr(vector <int> &p) { p.resize(n+1); for(int i = 1; i <= n; i++) { p[i] = i; } } int fnd(int x) { if(p[x] == x) return p[x]; return p[x] = fnd(p[x]); } void dfs(int x, int y) { h[x] = h[y] + 1; for(auto i : v[x]) { if(i.ff != y) dfs(i.ff, x); } } void upd(int a, int b, int w) { h.assign(n+1, 0); dfs(1, 0); if(h[b] > h[a]) swap(b, a); int x = a, y = b; while(h[a] > h[b]) { for(auto &i : v[a]) { if(i.ff == x) i.ss = min(i.ss, w); } x = a; for(auto i : v[a]) { if(h[i.ff] < h[a]) { a = i.ff; break; } } } while(a != b) { for(auto &i : v[a]) { if(i.ff == x) i.ss = min(i.ss, w); } for(auto &i : v[b]) { if(i.ff == y) i.ss = min(i.ss, w); } x = a, y = b; for(auto i : v[a]) { if(h[i.ff] < h[a]) { a = i.ff; break; } } for(auto i : v[b]) { if(h[i.ff] < h[b]) { b = i.ff; break; } } } for(auto &i : v[b]) { if(i.ff == x or i.ff == y) i.ss = min(i.ss, w); } } void f(int x, int y, ll w) { an += (w * a[x]); for(auto i : v[x]) { if(i.ff == y) continue; f(i.ff, x, w + i.ss); } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> k; vector <pair <int, pair <int, int>>> vc, vc1; for(int i = 1; i <= m; i++) { int u1, u2, c; cin >> u1 >> u2 >> c; vc.push_back({c, {u1, u2}}); } sort(vc.begin(), vc.end()); clr(p); for(int i = 0; i < m; i++) { int a = fnd(vc[i].ss.ff), b = fnd(vc[i].ss.ss); if(a == b) continue; p[b] = a; vc1.push_back(vc[i]); } vc = vc1; blue.resize(k+1); for(int i = 0; i < k; i++) { cin >> blue[i].ff >> blue[i].ss; } a.resize(n+1); for(int i = 1; i <= n; i++) { cin >> a[i]; } ll ans = 0; for(int mask = 0; mask < (1<<k); mask++) { clr(p); bool tr = 0; v.clear(); v.resize(n+1); for(int i = 0; i < k; i++) { if((mask>>i)&1) { int a = fnd(blue[i].ff), b = fnd(blue[i].ss); if(a == b) { tr = 1; break; } p[b] = a; v[blue[i].ff].push_back({blue[i].ss, 1e9}); v[blue[i].ss].push_back({blue[i].ff, 1e9}); } } if(tr) continue; for(auto i : vc) { int a = fnd(i.ss.ff), b = fnd(i.ss.ss); if(a != b) { p[b] = a; v[i.ss.ff].push_back({i.ss.ss, 0}); v[i.ss.ss].push_back({i.ss.ff, 0}); } else { upd(i.ss.ff, i.ss.ss, i.ff); } } an = 0; f(1, 0, 0); ans = max(ans, an); } cout << ans; 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...