并查集用于:
1.合并两个集合
2.查询两个元素是否在一个集合中
创建元素数组
const int N = 100010;
int p[N];
初始化根节点
for (int i = 0; i < N; i ++ ) p[i] = i;
嗯,这个地方如果是N的话就是比n要更具有健壮性。因为你如果是大N的话就没有任何限制一定是可以运行的,如果是小n的话如果你n没有在之前读入的话就可能会出错。
find函数
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
!!!
这里,你居然,
背错了,致命错误,失之毫厘,差之千里啊啊啊啊啊啊啊
就整个函数里面,就一个·x
,你比赛的时候背成了p[x] = find(x)了!!!!
就记住一整个find,就是单纯地和p[x]磕上了。
合并两个集合
p[find(a)] = find(b);
要特别注意的一点是:你有了find函数,所以你每次在找你这个元素属于什么集合的时候,你都要用find函数,而不是p[x]!!!
就是说,如果你能够确定这个根结点没有变的话,你可以用p[a]不然,你都是得用find(a)来找到它的根结点的。
看一共有多少个集合
把所有元素都放进一个集合里面,然后遍历这个集合,看他的根结点是不是自己,就这么简单。