CF1559D1. Mocha and Diana (Easy Version)

原题链接:1559D1. Mocha and Diana (Easy Version)

题意:

小明和小红各有一个具有n个结点的森林,现执行操作:

  • 加一条边,使得两人的森林还是森林
  • 小明加一条(u,v)的边,那么小红也必须加一条(u,v)的边。
    问我们最多能加多少边?

思路:

很明显,第一个条件没啥用,关键是第二个条件,我们知道如果一个人不能加(u,v)一条边的前提条件是uv已经联通,那么根据这个条件,我们可以使用并查集,而边的数据范围是[11000],所以可以直接暴力枚举点,然后使用并查集来判断两个点是否已经在一个集合内,如果在一个集合内那么就不能加边了,否则加上即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;
int fa1[N], fa2[N];

int find1(int x) {
	if (x != fa1[x]) fa1[x] = find1(fa1[x]);
	return fa1[x];
}

int find2(int x) {
	if (x != fa2[x]) fa2[x] = find2(fa2[x]);
	return fa2[x];
}

int main() {
	ios::sync_with_stdio(false), cin.tie(0);
	
	int n, m1, m2;
	cin >> n >> m1 >> m2;
	for (int i = 1; i <= n; i++) fa1[i] = i, fa2[i] = i;
	while (m1--) {
		int a, b;
		cin >> a >> b;
		fa1[find1(a)] = find1(b);
	}
	
	while (m2--) {
		int a, b;
		cin >> a >> b;
		fa2[find2(a)] = find2(b);
	}
	
	vector<pair<int, int>> add;
	for (int i = 1; i <= n; i++) {
		for (int j = i + 1; j <= n; j++) {
			int u1 = find1(i), v1 = find1(j);
			int u2 = find2(i), v2 = find2(j);
			if (u1 != v1 && u2 != v2) {
				add.push_back({i, j});
				fa1[u1] = v1;
				fa2[u2] = v2;	
			}
		}
	}
	
	cout << add.size() << endl;
	for (int i = 0; i < add.size(); i++) 
		cout << add[i].first << " " << add[i].second << endl;
	
    return 0;
}

注意:

题目思路并不难,但是我耗了一个多小时,原因:
我一开始find函数写成了这样。

int find1(int x) {
	if (x == fa1[x]) return x;
	return find1(fa1[x]);
}

乍一看没错,确实没错,就是T到飞起,为啥,因为没有加入路径压缩的优化,所以T到飞起,我服了,这次长记性了。
另外,以后并查集用一个类吧,贴个板子:

struct DSU{
	int fa[N], Size[N];
	void init() {
		for (int i = 1; i <= n; i++) fa[i] = i;
	}
	int find(int x) {
		if (x != fa[x]) fa[x] = find(fa[x]);
		return fa[x];
	}
	void merge(int x, int y) {
		Size[find(y)] += Size[find(x)];
		fa[find(x)] = find(y);
	}
	bool check(int x, int y) {
		return find(x) == find(y);
	}
}dsu1, dsu2;
posted @   Xxaj5  阅读(85)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2020-08-16 二分图(染色法判断二分图 求二分图的最大匹配)
2020-08-16 最小生成树(Kruskal Prim)
点击右上角即可分享
微信分享提示