HDU 4313 Matrix(并查集/破坏边使得k个点两两不连通的最少代价)

阅读: 评论:0

HDU 4313 Matrix(并查集/破坏边使得k个点两两不连通的最少代价)

HDU 4313 Matrix(并查集/破坏边使得k个点两两不连通的最少代价)

题目链接:
HDU 4313 Matrix
题意:
有 n 个点和n−1条无向边,需要破坏一些边使得给定的 k 个点两两不连通,求最少的破坏代价?
数据范围:n≤105
分析;

#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小时内删除。

标签:代价   HDU   个点两两不   Matrix
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23