并查集

这篇博客探讨了并查集在不同场景下的应用,包括237. 程序自动分析中用于合并相等数字,238. 银河英雄传说中使用带权并查集记录距离,239. 奇偶游戏中通过扩展域并查集处理奇偶性,以及240. 食物链中利用扩展域并查集解决食物链关系。博客提到了如何初始化并查集,如何处理不同情况下的并查集操作,以及如何判断和合并不同集合的关系。
摘要由CSDN通过智能技术生成

237. 程序自动分析

在这里插入图片描述
在这里插入图片描述

先将数字进行离散化,再用并查集合并相等的数字,并将不相等的数字记录下来
最后比较所有不相等的数字,如果两个数字不在一个并查集内,则说明可以满足条件
记得要初始化所有变量和数组

#include <cstdio>
#include <cstring>
#include<tr1/unordered_map>
using namespace std::tr1;
const int N = 2e6 + 5;

int cnt;//离散化的数字 
unordered_map<int, int> m;//记录离散化后的数 

int bcj[N];//记录每个节点的父节点
int idx, x[N], y[N];

int mapping(int x)//离散化 
{
   
	if (m.count(x)) return m[x];
	return m[x] = cnt++;
}

void init(int n)//n棵有一个节点的树 
{
   
	for (int i = 1; i <= n; i++)
		bcj[i] = i;
}

int find(int x)//找到此节点的根节点
{
   
	if (bcj[x] == x)
		return x;
	else
		return bcj[x] = find(bcj[x]);
}

void unite(int x, int y)//合并x和y所在的集合 
{
   
	x = find(x), y = find(y);
	if (x == y) return;
	bcj[x] = y;
}

int main(void)
{
   
	int t, n;
	int i, j, e;
	bool flag;
	scanf("%d", &t);
	while (t--){
   
		scanf("%d", &n);
		//初始化 
		init(2 * n);
		flag = true;
		cnt = idx = 1;
		m.clear();
		while (n--){
   
			scanf("%d%d%d", &i, &j, &e);
			i = mapping(i), j = mapping(j);
			if (e == 1){
   //相等 
				unite(i, j);
			}
			else{
   
				x[idx] = i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值