比赛 2025新春开学欢乐赛 评测结果 AAAAAAAAAA
题目名称 t2 最终得分 100
用户昵称 flyfreem 运行时间 2.114 s
代码语言 C++ 内存使用 14.37 MiB
提交时间 2025-02-15 17:35:00
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 300010
// By flyfreemrn
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
struct node_line{
	ll x,y,w;
}line1[MAXN],line2[MAXN];
bool cmp(node_line a,node_line b){
	return a.w<b.w;
}
struct node_dsu{
	ll fa[MAXN],siz;
	ll find(ll x){
		return (fa[x]==x)?x:fa[x]=find(fa[x]);
	}
	void merge(ll x,ll y){
		x=find(x),y=find(y);
		if(x!=y)fa[x]=y,siz--;
	}
	void build(ll x){
		siz=x;
		for(int i=1;i<=x;i++)fa[i]=i;
	}
}dsu1,dsu2;
ll n1,n2,m1,m2;
ll ans;
int main(){
	freopen("emptyfist.in","r",stdin);
	freopen("emptyfist.out","w",stdout);
	n1=read(),n2=read(),m1=read(),m2=read();
	for(int i=1;i<=m1;i++)line1[i].x=read(),line1[i].y=read(),line1[i].w=read();
	for(int i=1;i<=m2;i++)line2[i].x=read(),line2[i].y=read(),line2[i].w=read();
	sort(line1+1,line1+1+m1,cmp);
	sort(line2+1,line2+1+m2,cmp);
	dsu1.build(n1),dsu2.build(n2);
	ll l1=1,l2=1;
	for(int i=1;i<=m1+m2;i++){
		if(l1<=m1&&dsu1.find(line1[l1].x)==dsu1.find(line1[l1].y)){
			l1++;continue;
		}else if(l2<=m2&&dsu2.find(line2[l2].x)==dsu2.find(line2[l2].y)){
			l2++;continue;
		}else{
			ll val1=dsu2.siz*line1[l1].w,val2=dsu1.siz*line2[l2].w;
			if(l1<=m1&&(l2>m2||line2[l2].w>line1[l1].w)){
				dsu1.merge(line1[l1].x,line1[l1].y);
				ans+=val1;
//				cout<<1<<" "<<line1[l1].x<<" "<<line1[l1].y<<endl;
				l1++;
			}else{
				dsu2.merge(line2[l2].x,line2[l2].y);
				ans+=val2;
//				cout<<2<<" "<<line2[l2].x<<" "<<line2[l2].y<<endl;
				l2++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}