题目链接:
HDU 4313 Matrix
题意:
有 n 个点和
数据范围:
分析;
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <climits>
using namespace std;
typedef long long ll;
const int MAX_N = 100010;int T, n, k, m;
int exist[MAX_N], father[MAX_N];struct Edge {int u, v, w;bool operator < (const Edge& rhs) const {return w > rhs.w;}
}edge[MAX_N];inline int find(int x)
{return father[x] == x ? x : father[x] = find(father[x]);
}ll solve()
{ll res = 0;for (int i = 0; i < m; ++i) {int u = edge[i].u, v = edge[i].v, w = edge[i].w;int fu = find(u), fv = find(v);if (exist[fu] && exist[fv] ) {res += w;father[fu] = fv;} else {if (exist[fu]) father[fv] = fu;else father[fu] = fv;}}return res;
}int main()
{scanf("%d", &T);while (T--) {scanf("%d%d", &n, &k);for (int i = 0; i < n - 1; ++i) {int u, v, w;scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);}for (int i = 0; i < n; ++i) { father[i] = i; }memset(exist, 0, sizeof(exist));for (int i = 0; i < k; ++i) {int id;scanf("%d", &id);exist[id] = 1;}m = n - 1;sort(edge, edge + m);printf("%lldn", solve());}return 0;
}
本文发布于:2024-02-01 12:18:32,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676111436541.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |