社区讨论

30pts求调

P2700逐个击破参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lq6rsyao
此快照首次捕获于
2023/12/15 23:14
2 年前
此快照最后确认于
2023/12/16 10:42
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,ans;
bool city[100005];
struct edge{
	int u,v,w;
}e[200005];
bool cmp(edge a,edge b){
	return a.w>b.w;
}
int cnt;
void add(int u,int v,int w){
	cnt++;
	e[cnt].u=u;
	e[cnt].v=v;
	e[cnt].w=w;
}
int fa[100005];
int find(int x){
	int r=x;
	while(r!=fa[r]){
		r=fa[r];
	}
	while(x!=r){
		int c=x;
		x=fa[x];
		fa[c]=r;
	}
	return r;
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=k;i++){
		int u;
		cin>>u;
		city[u]=true;
	}
	for(int i=0;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		ans+=w;
		add(u,v,w);
	}
	sort(e+1,e+n+1,cmp);
	for(int i=1;i<n;i++){
		int u=e[i].u,v=e[i].v;
		int fu=find(u),fv=find(v);
		if(city[fu]&&city[fv]){
			continue;
		}
		fa[u]=v;
		ans-=e[i].w;
		city[u]=city[v]=city[u]||city[v];
	}
	cout<<ans;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...