70分,有注释,求调
  • 板块P2078 朋友
  • 楼主ansan
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/6 21:23
  • 上次更新2024/4/6 23:44:15
查看原帖
70分,有注释,求调
1120932
ansan楼主2024/4/6 21:23
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int fa[20000], fb[20000];//把男女分成两个并查集,fa是男,fb是女;
int finda(int x) {
	if (fa[x] == x)
		return x;
	return fa[x] = finda(fa[x]);//对男的进行查照
}
int findb(int x) {
	if (fb[x] == x)
		return x;
	return fb[x] = findb(fb[x]);//对女的进行查找
}
int main() {
	int n, m, p, q;
	cin >> n >> m >> p >> q;
	int p1 = p, q1 = q;//后面的while会改变p,q的值,所以先存起来;
	for (int i = 1; i <= p; i++)
		fa[i] = i;
	for (int i = 1; i <= q; i++)
		fb[i] = i;
	int x, y, ans1 = 0, ans2 = 0; //分别设置小明和小红的朋友数,ans1和ans2;
	while (p--) {
		cin >> x >> y;
		if (finda(x) != finda(y))
			fa[finda(y)] = finda(x);//男的并查集;
	}
	for (int i = 1; i <= p1; i++) {
		if (finda(fa[i]) == finda(fa[1]))
			ans1++;//计算小明朋友数量;
	}
	while (q--) {
		cin >> x >> y;
		x = fabs(x), y = fabs(y);//加绝对值计算
		if (findb(x) != findb(y))
			fb[findb(y)] = findb(x);//女的并查集
	}
	for (int i = 1; i <= q1; i++) {
		if (findb(fb[i]) == findb(fb[1]))
			ans2++;//计算女的数量
	}
	cout << min(ans1, ans2);//输出两者小的那个;

	return 0;
}
2024/4/6 21:23
加载中...