比赛 |
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;
}