学习链接: https://zhuanlan.zhihu.com/p/93647900
三个关键点:
1)初始化底层数组,一般是若干个孤立的点。
2)合并连通域
3)查找每个连通域的代表元素。
性能优化:
1)路径压缩
即将当前节点的父节点设置成代表元(递归设置成父节点的父节点)。
2)秩合并
将秩小的的元素的代表元合并到秩大的代表元。
题目:
对无向图类型的树而言,N个节点有N-1条边。如果有N条边,则有一条边加进来的时候会形成环。如果一条边在合并之前属于两个不同的连通域,则不会形成环,否则将会形成环。
相等的元素应该属于同一个连通域,不相等的关系应该属于不同的连通域。
1)初始时,26个字母构成并查集的基础数组。
2)先遍历所有的相等关系构建连通域,
3)再处理不相等的关系。
等式的两个操作数位于同一个连通域,满足传递性。 因此,如果查询的两个元素在同一个连通域则可以利用 dfs 求出其结果,否则就为-1.
1) 因为初始时不知道有多少不同的操作数,故采用 unordered_map 作为存储父节点的基础数组,并在构建基础数组的同时记录各个节点的边以及权重。
2)遍历所有的equations元素构建连通域
3)处理查询, 在同一个连通域的则可以利用dfs求出等式结果,否则为 -1 .
交换关系具有传递性,能够相互交换的字符组成连通域, 分别对同一个连通域中的元素排序, 然后将其放置在对应的位置即可。
1)基础数组的大小为字符串长度,图节点为下标值,根据pairs构建连通域。
2)根据连通图生成一个map. 代表元为key, 同一个连通域的节点为values.
3) 对values的元素进行的排序。
4)将排序后的元素放置到对应的位置。
操作次数比连通域的个数少1.
给定一个点(x,y)所有与横坐标为 x 和 纵坐标为 y 的点都属于同一个连通域。同一个连通域的点可以删除只剩下一个点。 因此最多删除的石头个数等于总石头的个数减去连通域的个数。
并查集的基数组中的元素为坐标值,对一个点(x,y) 横坐标 等于x或者纵坐标等于y的石头也处于该连通域。每个点能够将x轴上的点和y轴点合并成一个连通域, 但是我们需要区分横坐标和纵坐标, 可以通过让x+10001使得横坐标和纵坐标处于不同的表示区间。