并查集就是用于集合类关系问题,如果仅仅需要判断两个节点是否属于一个连通分量,如果用图作为存储的数据结构,在用dfs遍历,会将问题复杂化,所以用一种新的数据结构----并查集来储存数据,可以极高的提高效率。
思路:
前提:用fa[i]存储i结点的前驱结点,如果两个结点属于同一个集合,则他们最终的root一定是一样的。
1.先创建一个数组fa[max],让fa[i]=i;这一步的作用是让每一个结点都是一个集合。
2.读入数据x,y,将包含x的集合和包含y的集合合并为一个集合。
3.重复2,直到所有数据录入完成。
4.输入要判断关系的两个结点,判断两个结点的root是否一样。
#include<iostream>
using namespace std;
int fa[100];
int find(int x) {
return fa[x] == x ? x : find(fa[x]);
}
void unin(int x, int y) {
int root1 = find(x);
int root2 = find(y);
if (root1 != root2) {
fa[root1] = root2;
}
}
int main() {
for (int i = 0; i < 100; i++) {
fa[i] = i;
}
int k;
cin >> k;
for (int i = 0; i < k; i++) {//合并集合
int a, b;
cin >> a >> b;
unin(a, b);
}
int x,y;
cin >> x>>y;
if (find(x) == find(y))//查找集合
cout << "yes";
else
cout << "no";
}
这里有一道并查集的题目可以练一下手:
L2-007 家庭房产 (25 分)