mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
53497060fc
4300-4399
78 lines
1.6 KiB
C++
78 lines
1.6 KiB
C++
#include <iostream>
|
|
#include <cstring>
|
|
#include <cstdio>
|
|
#include <algorithm>
|
|
#include <cmath>
|
|
#include <vector>
|
|
using namespace std;
|
|
const int maxn = 100010;
|
|
int t, n, k;
|
|
int mach[maxn], father[maxn];
|
|
struct Edge {
|
|
int u, v, c;
|
|
}edge;
|
|
vector<Edge> vv;
|
|
bool cmp(Edge a, Edge b)
|
|
{
|
|
return a.c > b.c;
|
|
}
|
|
void initSet()
|
|
{
|
|
for (int i = 0; i < maxn; ++i) {
|
|
father[i] = i;
|
|
mach[i] = 0;
|
|
}
|
|
}
|
|
int find(int x)
|
|
{
|
|
if (x != father[x]) {
|
|
father[x] = find(father[x]);
|
|
}
|
|
return father[x];
|
|
}
|
|
void merge(int a, int b)
|
|
{
|
|
a = find(a);
|
|
b = find(b);
|
|
if (a == b) return ;
|
|
if (a < b) {
|
|
father[b] = a;
|
|
mach[a] += mach[b];
|
|
} else {
|
|
father[a] = b;
|
|
mach[b] += mach[a];
|
|
}
|
|
}
|
|
int main()
|
|
{
|
|
scanf("%d", &t);
|
|
while (t--) {
|
|
scanf("%d%d", &n, &k);
|
|
vv.clear();
|
|
initSet();
|
|
int u, v, c;
|
|
__int64 ans = 0;
|
|
for (int i = 0; i < n - 1; ++i) {
|
|
scanf("%d%d%d", &u, &v, &c);
|
|
edge.u = u; edge.v = v; edge.c = c;
|
|
vv.push_back(edge);
|
|
ans += c;
|
|
}
|
|
for (int i = 0; i < k; ++i) {
|
|
scanf("%d", &u);
|
|
mach[u] = 1;
|
|
}
|
|
sort(vv.begin(), vv.end(), cmp);
|
|
for (int i = 0; i < n - 1; ++i) {
|
|
u = find(vv[i].u);
|
|
v = find(vv[i].v);
|
|
if (mach[u] + mach[v] <= 1) {
|
|
merge(u, v);
|
|
ans -= vv[i].c;
|
|
}
|
|
}
|
|
printf("%I64d\n", ans);
|
|
}
|
|
return 0;
|
|
}
|