和题解差不多的代码,我是MLE?并查集
查看原帖
和题解差不多的代码,我是MLE?并查集
1288168
silver_rain楼主2024/4/22 10:49

以下是我的代码:

#include<bits/stdc++.h>
using namespace std;

int fa[1001], enemy[1001];
int find_pa(int x);
int main()
{
	int n, rela_num;
	cin >> n >> rela_num;
	int i;
	for(i = 1; i <= n; i++) fa[i] = i, enemy[i] = 0;
	for(i = 1; i <= rela_num; i++)
	{
		char rela;
		int x, y;
		cin >> rela >> x >> y;
		if(rela == 'F')
		{
			if(fa[x] == x) fa[x] = y;
			else fa[find_pa(x)] = find_pa(y);
		}
		else
		{
			if(enemy[x] == 0)
				enemy[x] = y;
			else //说明x的敌人是enemy[x]=z, 而且x和y也是敌人,那么y和z是朋友 
			{
				if(fa[y] == y) fa[y] = enemy[x];
				else fa[find_pa(y)] = find_pa(enemy[x]);
			}
			if(enemy[y] == 0)
				enemy[y] = x;
			else
			{
				if(fa[x] == x) fa[x] = enemy[y];
				else fa[find_pa(x)] = find_pa(enemy[y]);
			}			
		}
	}
	int ans = n;
	for(i = 1; i <= n; i++)
	{
		if(fa[i] != i) ans--;
	}
	cout << ans;
}

int find_pa(int x)
{
	if(fa[x] == x) return x;
	return fa[x] = find_pa(fa[x]);
}

下面是AC代码

#include<iostream>
#include<string>
using namespace std;
int n, m, f[1001], enm[1001]; //f存放节点的父亲,enm存放每个人的敌人
int find(int x) { //寻找x的祖先
	while (f[x] != x) x = f[x]; //不断更新寻找祖先
	return x;
}
void hebing(int x, int y) { //中文看得懂吧
	x = find(x);
	y = find(y); //无判定超简单合并_(:з」∠)_照顾一下和我一样的萌新
	if (x == y) return;
	f[y] = x;
	return;
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		f[i] = i;
	for (int i = 1; i <= m; i++) {
		int p, q;
		char c;
		cin >> c >> p >> q;
		if (c == 'F') hebing(p, q); //是朋友就合并
		else {
			if (enm[p] == 0) enm[p] = find(q);
			else hebing(q, enm[p]); //一个人有两个或更多敌人,合并他们
			if (enm[q] == 0) enm[q] = find(p);
			else hebing(p, enm[q]);
		}
	}
	int count[1001] = {0};
	for (int i = 1; i <= n; i++)
		count[find(i)]++;
	int cnt = 0;
	for (int i = 1; i <= n; i++)
		if (count[i]) cnt++; //统计,做得不是很简洁
	cout << cnt;
}
2024/4/22 10:49
加载中...