并查集:
我首先了解最基础的东西,这个是并查集
并查集就是在查找在 N 个节点中,从中找到 2 个节点是否在同一个集合里
方法:可以让节点们都有一个代表来代表它所在的一个集合,一个集合只由一个节点来表示
这个方法就是用一个函数来查找
确定找到它们的代表, 要定义一个数组表示所在节点他们的代表,这样更容易的是他们的代表与另外几个节点所连成的树只有 2 到 3 层,
第二要知道的是起初每一个节点就是一个集合,这样的一个节点就代表一个集合
在这里,我把这些节点用 F 数组表示,初始状态是:
for (int i = 1; i <= n; i++) {
f[i] = i; // 一个节点代表一个集合
}
然后就以两个节点连接起来为例,这里:
for (int i = 1; i <= m; i++) {
cin >> z >> x >> y; // x, y两个节点
int ax = find(x), ay = find(y); // 找到这两个节点自己所在集合的代表是哪个节点
if(z == 1){
if(ax != ay) f[ax] = ay; //连接两个节点
}//这里我是判断是否联立
}
然后就是最重要的一个查找代表的函数 :
int find(int x) {
if(x == f[x]) return x; // 如果找到了,就返回代表节点值
f[x] = find(f[x]); // 递归找下一个下标的节点
return f[x]; // 最终返回代表
}
ok, 就到这里了
3386

被折叠的 条评论
为什么被折叠?



