P2024 [NOI2001] 食物链 60pts求调
  • 板块灌水区
  • 楼主Manki23333333
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/15 09:38
  • 上次更新2023/11/2 13:44:38
查看原帖
P2024 [NOI2001] 食物链 60pts求调
871004
Manki23333333楼主2023/10/15 09:38
#include <bits/stdc++.h>

using namespace std;

const int N = 100005;

int n, m, ans, fa [N * 3];

int find (int x) {
	return x == fa [x] ? x : (fa [x] = find (fa [x]));
}

void Merge1 (int x, int y) {
	if (x > n || y > n) {
		ans ++;
		return ;
	}
		
	if (find(x + n) == find(y) || find(y) == find(x + n))
		ans ++;
	else 
		fa [find (x)] = find (y),
		fa [find (x + n)] = find (y + n),
		fa [find (x + n + n)] = find (y + n + n);
}

void Merge2 (int x, int y) {
	if (x == y || x > n || y > n) {
		ans ++;
		return ;
	}
		
	if (find(x) == find(y) || find(x) == find(y + n))
		ans ++;
	else 
		fa [find (x + n)] = find (y),
		fa [find (x + n + n)] = find (y + n),
		fa [find (x)] = find (y + n + n);
}



int main() {
	cin >> n >> m;
	
	for (int i = 0 ; i < 3 * n ; i ++) 
		fa [i] = i;
		
	while (m --) {
		int opt, x, y;
		
		cin >> opt >> x >> y;
		
		if (opt == 1) {
			Merge1 (x, y);
		} else {
			Merge2 (x, y);
		}
	}
	
	cout << ans;
	return 0;
}
2023/10/15 09:38
加载中...