hiho_1066_并查集

Posted 农民伯伯-Coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hiho_1066_并查集相关的知识,希望对你有一定的参考价值。

题目大意

    给出N个操作,每个操作可能为两种类型之一: 
1. 认定两个人属于同一个组织 
2. 查询两个人是否是同一个组织

    要求对于每个操作类型2,给出结果,即查询的两个人是否属于同一个组织。其中,任何人都可以通过名字唯一确定。

分析

    简单的并查集操作,直接使用哈希表存储名字字符串作为并查集树,而不用整数数组。unordered_map.

实现

#include<iostream>
#include<string.h>
#include<iostream>
#include<queue>
#include<unordered_map>
#include<string>
using namespace std;
unordered_map<string, string> root; //存放并查集树节点,以及对应的根
string GetRoot(string node){
	if (node == root[node])
		return node;
	return root[node] = GetRoot(root[node]);
}
void Union(string person1, string person2){
	string p1 = GetRoot(person1);
	string p2 = GetRoot(person2);
	root[p2] = p1;
}
bool SameRoot(string person1, string person2){
	string p1 = GetRoot(person1);
	string p2 = GetRoot(person2);
	return p1 == p2;
}
int main(){
	int n, op;
	string person1, person2;
	cin >> n;
	while (n--){
		cin >> op >> person1 >> person2;
		if (root.find(person1) == root.end()){
			root[person1] = person1;
		}
		if (root.find(person2) == root.end()){
			root[person2] = person2;
		}

		if (op == 0){
			Union(person1, person2);
		}
		else{
			if (SameRoot(person1, person2))
				printf("yes\n");
			else
				printf("no\n");
		}
	}
	return 0;
}

 

以上是关于hiho_1066_并查集的主要内容,如果未能解决你的问题,请参考以下文章

[HIHO1322]树结构判定(并查集)

[bzoj3669][Noi2014]魔法森林_LCT_并查集

[bzoj1455]罗马游戏_左偏树_并查集

[bzoj2443][Usaco2011 Open]奇数度数_树形dp_生成树_并查集

[bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树

hiho14 无间道之并查集图论--并查集