제출 #1166133

#제출 시각아이디문제언어결과실행 시간메모리
1166133ALTAKEXE통행료 (APIO13_toll)C++20
56 / 100
2592 ms12708 KiB
#include <bits/stdc++.h> #define ll long long #define ff first #define ss second #define pii pair<int,int> #define pb push_back #define eb emplace_back #define inf INT_MAX #define all(x) x.begin(),x.end() const int MOD = 1e9+7; using namespace std; ll n, m, k, an; vector<int> p, a, h; vector<vector<pair<int,int>>> v; vector<pair<int,int>> blue; void budah(vector <int> &p) { p.resize(n+1); for(int i = 1; i <= n; i++) { p[i] = i; } } int ol(int x) { if(p[x] == x) return p[x]; return p[x] = ol(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 a1, int b1, int w) { h.assign(n+1, 0); dfs(1, 0); if(h[b1] > h[a1]) swap(b1, a1); int x = a1, y = b1; while(h[a1] > h[b1]) { for(auto &i : v[a1]) { if(i.ff == x) i.ss = min(i.ss, w); } x = a1; for(auto i : v[a1]) { if(h[i.ff] < h[a1]) { a1 = i.ff; break; } } } while(a1 != b1) { for(auto &i : v[a1]) { if(i.ff == x) i.ss = min(i.ss, w); } for(auto &i : v[b1]) { if(i.ff == y) i.ss = min(i.ss, w); } x = a1, y = b1; for(auto i : v[a1]) { if(h[i.ff] < h[a1]) { a1 = i.ff; break; } } for(auto i : v[b1]) { if(h[i.ff] < h[b1]) { b1 = i.ff; break; } } } for(auto &i : v[b1]) { 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.pb({c, {u1, u2}}); } sort(vc.begin(), vc.end()); budah(p); for(int i = 0; i < m; i++) { int a1 = ol(vc[i].ss.ff), b1 = ol(vc[i].ss.ss); if(a1 == b1) continue; p[b1] = a1; vc1.pb(vc[i]); } vc = vc1; blue.resize(k); 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++) { budah(p); bool tr = 0; v.clear(); v.resize(n+1); for(int i = 0; i < k; i++) { if((mask>>i)&1) { int a1 = ol(blue[i].ff), b1 = ol(blue[i].ss); if(a1 == b1) { tr = 1; break; } p[b1] = a1; v[blue[i].ff].pb({blue[i].ss, 1e9}); v[blue[i].ss].pb({blue[i].ff, 1e9}); } } if(tr) continue; vector <int> t(n+1, 0); for(int i = 0; i < vc.size(); i++) { int a1 = ol(vc[i].ss.ff), b1 = ol(vc[i].ss.ss); if(a1 != b1) { p[b1] = a1; v[vc[i].ss.ff].pb({vc[i].ss.ss, 0}); v[vc[i].ss.ss].pb({vc[i].ss.ff, 0}); } else { t[i] = true; } } for(int i = 0; i < vc.size(); i++) { if(!t[i]) continue; upd(vc[i].ss.ff, vc[i].ss.ss, vc[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...