样例未过60pts,换了一种合并方法AC, 求原因
查看原帖
样例未过60pts,换了一种合并方法AC, 求原因
1120928
XuYu0317楼主2024/4/10 15:48

60pts

#include <bits/stdc++.h>

using namespace std;
int n, m, ans, f[1010], en[1010];

int find(int a) {
	if (f[a] == a) return a;
	else return f[a] = find(f[a]);
}

void hb(int x, int y) {
	if (find(x) == find(y)) return;
	f[find(y)] = find(x);
	return;
}

int main() {
	scanf("%d%d", &n, &m);
	
	for (int i = 1; i <= n; i ++) f[i] = i;
	
	for (int i = 1, x, y; i <= m; i ++) {
		char op;
		cin >> op;
		scanf("%d%d", &x, &y);
		if (op == 'F') {
			hb(x, y);
		}
		else {
			if (en[x] == 0) en[x] == find(y);
			else hb(en[x], y);
			if (en[y] == 0) en[y] == find(x);
			else hb(en[y], x);
		}
	}

	for (int i = 1; i <= n; i ++) {
		if (find(i) == i) ans ++;
	}

	printf("%d", ans);
	return 0;
}

AC

#include <bits/stdc++.h>

using namespace std;
int n, m, ans, f[2020], en[2020][2020];

int find(int a) {
	if (f[a] == a) return a;
	else return f[a] = find(f[a]);
}

void hb(int x, int y) {
	f[find(y)] = find(x);
	return;
}

int main() {
	scanf("%d%d", &n, &m);
	
	for (int i = 1; i <= n * 2; i ++) f[i] = i;
	
	for (int i = 1, x, y; i <= m; i ++) {
		char op;
		cin >> op;
		scanf("%d%d", &x, &y);
		if (op == 'F') {
			hb(x, y);
		}
		else {
			en[x][y] = en[y][x] = 1;
			for (int i = 1; i <= n; i ++) {
				if (en[x][i]) hb(y, i);
				if (en[y][i]) hb(x, i);
			}
		}
	}

	for (int i = 1; i <= n; i ++) {
		if (find(i) == i) ans ++;
	}

	printf("%d", ans);
	return 0;
}
2024/4/10 15:48
加载中...