【最大生成树】洛谷P2700 逐个击破

P2700 逐个击破

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 2e5 + 10, M = N;

int n, k;
LL res, sum;
bool st[N];
int p[N];

struct Edge
{
	int a, b, w;
	bool operator< (const Edge &t)const
	{
		return w > t.w;//从大到小排
	}
}e[M];

int find(int x)
{
	return x == p[x] ? x : p[x] = find(p[x]);
}

LL kruskal()
{
	for (int i = 1; i <= n; i++) p[i] = i;
	sort(e, e + n - 1);
	LL res = 0;
	for (int i = 0; i < n - 1; i++)
	{
		int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
		if (a != b)
		{
			if (st[a] && st[b]) continue; //两个敌方结点
			p[a] = b;
			res += w;	
			if (st[a]) st[b] = true;
			else if (st[b]) st[a] = true;
		}
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	cin >> n >> k;
	while (k--)
	{
		int x;
		cin >> x;
		st[x] = true;
	}
	for (int i = 0; i < n - 1; i++)
	{
		int a, b, w;
		cin >> a >> b >> w;
		e[i] = {a, b, w};
		sum += w;
	}
	printf("%lld", sum - kruskal());
	return 0;
}
posted @   Tshaxz  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
Language: HTML
点击右上角即可分享
微信分享提示