#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using pl = pair<ll,ll>;
using pii = pair<int,int>;
using tpl = tuple<int,int,int>;
#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())
struct DSU {
vector<int> lab, weight;
DSU (int sz) : lab(sz + 1, -1), weight(sz + 1) {}
int get (int u) {
if (lab[u] < 0) return u;
return lab[u] = get(lab[u]);
}
void asgn (int u, int cur) { weight[get(u)] = cur; }
bool unite (int a, int b) {
a = get(a), b = get(b);
if (a == b) return 0;
if (-lab[a] < -lab[b]) swap(a, b);
weight[a] += weight[b];
lab[a] += lab[b], lab[b] = a;
return 1;
}
};
const int mn = 1e5 + 5;
ll minWeight[30][30], component[mn], cmpr[mn];
ll subtr[mn], sumWeight[mn], curCost, cnt;
vector<pii> adj[mn];
bool vis[30];
void dfs (int u, int p) {
subtr[u] = sumWeight[u], cnt++, vis[u] = 1;
for (auto [v, w] : adj[u]) {
if (v == p) continue;
if (!vis[v]) {
dfs(v, u);
subtr[u] += subtr[v];
curCost += w * subtr[v];
}
}
}
int main()
{
// freopen("TOLL.inp", "r", stdin);
// freopen("TOLL.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
/// read input & prepare DSU
int n, m, k; cin >> n >> m >> k;
vector<tpl> edge(m);
vector<pii> newEdge(k);
for (auto &cur : edge) {
int a, b, c; cin >> a >> b >> c;
cur = make_tuple(c, a, b);
}
sort(all(edge));
DSU initdsu(n), dsu(n);
for (auto &cur : newEdge) {
int a, b; cin >> a >> b;
cur = make_pair(a, b);
initdsu.unite(a, b);
}
vector<int> weight(n + 1);
for (int i = 1; i <= n; i++) {
cin >> weight[i];
dsu.asgn(i, weight[i]);
}
/// classify edge
vector<tpl> unused;
for (int i = 0; i < m; i++) {
int a, b, c; tie(c, a, b) = edge[i];
if (initdsu.unite(a, b)) dsu.unite(a, b);
else unused.emplace_back(a, b, c);
}
/// re-index connected components
int counter = 0;
for (int i = 1; i <= n; i++)
if (i == dsu.get(i))
cmpr[i] = ++counter, sumWeight[counter] = dsu.weight[i];
for (int i = 1; i <= n; i++)
component[i] = cmpr[dsu.get(i)];
/// process unused edges
for (int i = 1; i <= counter; i++)
for (int j = 1; j <= counter; j++) minWeight[i][j] = LLONG_MAX;
for (auto [a, b, c] : unused) {
int u = component[a], v = component[b];
minWeight[u][v] = minWeight[v][u] = min(minWeight[u][v], ll(c));
}
/// try subsets of new edges
ll ans = 0;
for (int mask = 0; mask < (1 << k); mask++) {
for (int i = 0; i < k; i++) {
if (mask & (1 << i)) continue;
int a, b; tie(a, b) = newEdge[i];
a = component[a], b = component[b];
adj[a].emplace_back(b, minWeight[a][b]);
adj[b].emplace_back(a, minWeight[a][b]);
}
curCost = cnt = 0, dfs(component[1], -1);
fill(vis + 1, vis + 1 + counter, 0);
for (int i = 1; i <= counter; i++) adj[i].clear();
if (cnt == counter) {
ans = max(ans, curCost);
}
}
cout << ans;
return 0;
}
# | 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... |