#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;
const int N = 100001, K = 21, INF = 1e7;
vector<pair<int, int>> cg[K];
int p[N], r[N], pp[N], par[K], uw[K], cnt[N];
ll utga[K], sum[K];
int find(int v)
{
if (p[v] != v)
p[v] = find(p[v]);
return p[v];
}
int merge(int u, int v)
{
u = find(u), v = find(v);
if (u == v)
return 0;
if (r[u] > r[v])
p[v] = u;
else
{
p[u] = v;
if (r[u] == r[v])
r[v]++;
}
return 1;
}
void dfs(int v, int p)
{
par[v] = p;
sum[v] = utga[v];
for (auto &i : cg[v])
{
if (i.ff == p)
continue;
uw[i.ff] = (i.ss == -1 ? INF : 0);
dfs(i.ff, v);
sum[v] += sum[i.ff];
}
}
void solve()
{
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> A(m, vector<int>(3)), B(k, vector<int>(3, -1)), C, D;
for (int i = 0; i < m; i++)
{
cin >> A[i][1] >> A[i][2] >> A[i][0];
A[i][1]--;
A[i][2]--;
}
sort(all(A));
for (int i = 0; i < n; i++)
p[i] = i;
for (int i = 0; i < k; i++)
{
cin >> B[i][1] >> B[i][2];
B[i][1]--;
B[i][2]--;
}
for (auto &i : A)
if (merge(i[1], i[2]))
B.pb(i);
for (int i = 0; i < n; i++)
{
p[i] = i;
r[i] = 0;
}
for (auto &i : B)
{
if (merge(i[1], i[2]) && i[0] > -1)
C.pb(i);
else if (i[0] > -1)
D.pb(i);
}
for (int i = 0; i < n; i++)
{
p[i] = i;
r[i] = 0;
}
for (auto &i : C)
merge(i[1], i[2]);
vector<int> li;
for (int i = 0; i < n; i++)
li.pb(find(i));
sort(all(li));
li.resize(unique(all(li)) - li.begin());
for (int i = 0; i < n; i++)
{
pp[i] = lower_bound(all(li), p[i]) - li.begin();
cin >> cnt[i];
utga[pp[i]] += cnt[i];
}
for (int i = 0; i < B.size(); i++)
{
B[i][1] = pp[B[i][1]];
B[i][2] = pp[B[i][2]];
}
for (int i = 0; i < D.size(); i++)
{
D[i][1] = pp[D[i][1]];
D[i][2] = pp[D[i][2]];
}
ll ans = 0;
for (int i = 0; i < (1 << k); i++)
{
int ok = 0;
for (int j = 0; j < li.size(); j++)
{
p[j] = j;
r[j] = 0;
cg[j].clear();
}
for (int j = 0; j < k; j++)
if ((i & (1 << j)))
{
if (!merge(B[j][1], B[j][2]))
{
ok = 1;
break;
}
cg[B[j][1]].pb({B[j][2], -1});
cg[B[j][2]].pb({B[j][1], -1});
}
if (ok)
continue;
vector<vector<int>> tot;
for (auto &i : D)
{
if (merge(i[1], i[2]))
{
cg[i[1]].pb({i[2], i[0]});
cg[i[2]].pb({i[1], i[0]});
}
else
tot.pb(i);
}
dfs(pp[p[0]], -1);
for (auto &i : tot)
{
int v1 = i[1], v2 = i[2];
if (sum[v1] < sum[v2])
swap(v1, v2);
while (v2 != v1)
{
uw[v2] = min(uw[v2], i[0]);
v2 = par[v2];
}
}
ll urj = 0;
for (int i = 0; i < li.size(); i++)
urj += uw[i] * sum[i];
ans = max(ans, urj);
}
cout << ans;
}
int main()
{
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
// 5 5 1
// 3 5 2
// 1 2 3
// 2 3 5
// 2 4 4
// 4 3 6
// 1 3
// 10 20 30 40 50
# | 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... |