题解:CF2060E Graph Composition
lalaji2010 · · 题解
CF2060E Graph Composition
分析
题目的意思其实就是,求最小代价,使得图
考虑必须做的操作。
那么
连通情况使用并查集维护即可。
由于这些操作都是必须做的,所以操作次数一定是最小的。
AC CODE
#include<bits/stdc++.h>
using namespace std;
int t;
int n,m1,m2;
int f[200005],f1[200005],a[200005],b[200005],c[200005],d[200005];
int find(int k){
if(f[k]==k){
return f[k];
}
return f[k]=find(f[k]);
}
int find1(int k){
if(f1[k]==k){
return f1[k];
}
return f1[k]=find1(f1[k]);
}
int main(){
cin>>t;
while(t--){
int cnt=0;
cin>>n>>m1>>m2;
for(int i=0;i<=n;i++) f[i]=i,f1[i]=i;
for(int i=1;i<=m1;i++){
int u,v;
cin>>u>>v;
a[i]=u,b[i]=v;
}
for(int i=1;i<=m2;i++){
int u,v;
cin>>u>>v;
c[i]=u,d[i]=v;
int fu=find(u),fv=find(v);
if(fu==fv) continue;
f[fv]=fu;
}
for(int i=1;i<=m1;i++){
int u=a[i];
int v=b[i];
int fu=find(u),fv=find(v);
int fu1=find1(u),fv1=find1(v);
if(fu==fv&&fu1!=fv1){
f1[fv1]=fu1;
}else if(fu!=fv){
cnt++;
}
}
for(int i=1;i<=m2;i++){
int u=c[i];
int v=d[i];
int fu=find(u),fv=find(v);
int fu1=find1(u),fv1=find1(v);
if(fu1!=fv1){
f1[fv1]=fu1;
cnt++;
}
}
cout<<cnt<<"\n";
}
return 0;
}