#include <bits/stdc++.h>
#define ar array
//#define int long long
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int mod = 1e9 + 7;
const ll inf = 1e18;
const int N = 1e5 + 5;
struct union_find {
int n;
vector<int> par, size;
union_find(int _n) : n(_n), par(n+1), size(n+1, 1) {
for(int i=1; i<=n; i++) par[i] = i;
}
int find(int u) {
if(u == par[u]) return u;
return par[u] = find(par[u]);
}
bool uni(int a, int b) {
a = find(a); b = find(b);
if(a == b) return 0;
if(size[a] < size[b]) swap(a, b);
size[a] += size[b];
par[b] = a;
return 1;
}
};
ll ans = 0, sub[N], dp[N];
int n, m, k, a[N], up[N][20], mx[N][20], dep[N], par[N];
vector<pii> g[N];
vector<ar<int, 3> > e1, e2, mst;
vector<ar<int, 3> > T[N];
bool cmp(ar<int, 4> x, ar<int, 4> y) {
if(x[0] != y[0]) return x[0] < y[0];
return x[1] < y[1];
}
void dfs(int u, int p) {
dep[u] = dep[p] + 1;
for(int i=1; i<20; i++) {
up[u][i] = up[up[u][i-1]][i-1];
mx[u][i] = max(mx[u][i-1], mx[up[u][i-1]][i-1]);
}
for(auto [v, w] : g[u]) if(v ^ p) {
up[v][0] = u;
mx[v][0] = w;
dfs(v, u);
}
}
pii lca(int a, int b) {
if(dep[a] < dep[b]) swap(a, b);
int d = dep[a] - dep[b], ans = 0;
for(int i=19; i>=0; i--) {
if(d & (1 << i)) {
ans = max(ans, mx[a][i]);
a = up[a][i];
}
}
if(a == b) return { a, ans };
for(int i=19; i>=0; i--) {
if(up[a][i] != up[b][i]) {
ans = max(ans, mx[a][i]);
ans = max(ans, mx[b][i]);
a = up[a][i];
b = up[b][i];
}
}
return { up[a][0], max(ans, mx[a][0]) };
}
void build_mst() {
union_find dsu(n);
sort(e1.begin(), e1.end());
for(auto [w, a, b] : e1) {
if(dsu.uni(a, b)) {
mst.push_back({ w, a, b });
g[a].push_back({ b, w });
g[b].push_back({ a, w });
}
}
dfs(1, 0);
}
int calc(int u, int p) {
dp[u] = 0;
sub[u] = a[u];
for(auto [v, w, t] : T[u]) if(v ^ p) {
// cout << u << " " << v << " " << w << endl;
sub[u] += calc(v, u);
dp[u] += dp[v];
if(!t) dp[u] += (ll)w * sub[v];
}
return sub[u];
}
void comp(int u, int p) {
dep[u] = dep[p] + 1;
par[u] = p;
for(auto [v, _, __] : T[u])
if(v != p) comp(v, u);
}
signed main() {
ios_base::sync_with_stdio(false);
cout.tie(0); cin.tie(0);
cin >> n >> m >> k;
for(int i=1; i<=m; i++) {
int a, b, w;
cin >> a >> b >> w;
e1.push_back({ w, a, b });
}
for(int i=1; i<=k; i++) {
int a, b; cin >> a >> b;
e2.push_back({ 0, a, b });
}
for(int i=1; i<=n; i++) {
cin >> a[i];
}
build_mst();
for(int mask=1; mask<(1<<k); mask++) {
bool ok = 1;
union_find dsu(n);
for(int u=1; u<=n; u++)
T[u].clear();
for(int i=0; i<k; i++) {
if(mask & (1 << i)) {
if(dsu.uni(e2[i][1], e2[i][2])) {
T[e2[i][1]].push_back({ e2[i][2], (int)1e9, 0 });
T[e2[i][2]].push_back({ e2[i][1], (int)1e9, 0 });
} else {
ok = 0;
break;
}
}
}
if(!ok) continue;
vector<int> skip(n+1);
for(int i=0; i<mst.size(); i++) {
if(dsu.uni(mst[i][1], mst[i][2])) {
T[mst[i][1]].push_back({ mst[i][2], 0, 0 });
T[mst[i][2]].push_back({ mst[i][1], 0, 0 });
} else skip[i] = 1;
}
comp(1, 0);
for(int i=0; i<mst.size(); i++) {
if(!skip[i]) continue;
auto [ww, u, v] = mst[i];
if(dep[u] < dep[v]) swap(u, v);
int pu = u;
u = par[u];
while(dep[u] > dep[v]) {
for(auto &[nxt, w, __] : T[u]) {
if(nxt == pu) {
w = min(ww, w);
}
}
pu = u;
u = par[u];
}
int pv = v;
v = par[v];
int cnt = 0;
while(u && v && cnt < 2) {
for(auto &[nxt, w, __] : T[u]) {
if(nxt == pu) {
w = min(ww, w);
}
}
for(auto &[nxt, w, __] : T[v]) {
if(nxt == pv) {
w = min(ww, w);
}
}
pu = u;
u = par[u];
pv = v;
v = par[v];
if(u == v) cnt++;
}
}
calc(1, 0);
ans = max(ans, dp[1]);
}
cout << ans << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |