专栏文章

题解:CF2060E Graph Composition

CF2060E题解参与者 2已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@miqezin3
此快照首次捕获于
2025/12/04 03:43
3 个月前
此快照最后确认于
2025/12/04 03:43
3 个月前
查看原文

CF2060E Graph Composition

分析

题目的意思其实就是,求最小代价,使得图 FF 与图 GG 连通情况相同。
考虑必须做的操作。
那么 FF 中使得与 GG 连通情况不同的边必须删去。GG 中有多余的边使得与 FF 连通情况不同,则 FF 必须加上这些边。完成这些操作后,FF 图合法。
连通情况使用并查集维护即可。
由于这些操作都是必须做的,所以操作次数一定是最小的。

AC CODE

CPP
#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;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...