求助求助,自己的思路为什么过不了
查看原帖
求助求助,自己的思路为什么过不了
579949
keedled楼主2023/1/7 18:08

就是把某一动物类的祖宗节点直接对A或B或C赋值*//就是把某一动物类的祖宗节点直接对A或B或C赋值

#include<iostream>
const int N = 5e5 + 10;
using namespace std;
int pre[N], ans, A, B, C;
int find(int x) {//找到x的父亲加路径压缩=>直接返回x的祖宗节点
	if(x != pre[x])pre[x] = find(pre[x]);
	return pre[x];
}
bool eat_c(int x, int y){//判断是否存在食物链上的关系
	if ((x == y) && (x == A || x == B || x == C))return false;
	if ((x == A || x == C || x == B) && (y == A || y == B || y == C))return true;
	return false;
}
bool check(int x, int y) {//检查是否违反之前的食物链关系
	if (!A && !B){//如果没有先创建A,B;
		A = x, B = y;
		return true;
	}
	if (!C) {//没有C先创建
		if (x == B) {
			C = y; 
			return true;
		}
		else if (y == A) {
			C = x;
			return true;
		}
	}
	if (x == A) {
		if (y != B)return false;
		return true;
	}
	else if (x == B) {
			if (y != C)return false;
		return true;
	}
	else if (x == C) {
		if (y != A)return false;
		return true;
	}
	return false;
}
int main() {
	int n, k; cin >> n >> k;
	for (int i = 1; i <= n; i++)pre[i] = i;
	int d, x, y;
	while (k--) {
		cin >> d >> x >> y;
		if (d == 1) {
			if (x > n || y > n)ans++;
			else if (eat_c(find(x), find(y)))ans++;//判断是否有食物链上的关系
			else {//检查所在食物链的位置,并更新食物链位置;合并同类
				if (find(x) == A)A = find(y);
				else if (find(x) == B)B = find(y);
				else if (find(x) == C)C = find(y);
				pre[find(x)] = find(y);
			}
		}
		if (d == 2) {
			if (x > n || y > n)ans++;
			else if (find(x) == find(y))ans++;//是否为同类
			else if(!check(find(x), find(y)))ans++;//检查是否违反之前的食物链规则
		}
	}
	cout << ans;
	return 0;
}
2023/1/7 18:08
加载中...