Golang实现并查集,解决分类分门派分省份等按关系分组的问题

解决问题举例 1,有不同的金庸笔下的人物,给出不同人物和人物之间的关系 如果他们间接都有联系,说明他们属于一本小说里,求这些人属于几本书 2,力扣547题,如果

解决问题举例
1,有不同的金庸笔下的人物,给出不同人物和人物之间的关系
如果他们间接都有联系,说明他们属于一本小说里,求这些人属于几本书
2,力扣547题,如果不同城市可以间接连同,说明属于一个省份,求一共有几个省份
3,忘了哪个公司的真题,吃鸡游戏跳伞的时候可以选择跟随,每个人都跟随一个人,也可以跟随自己,如果一些人都间接跟随,那么他们属于一个团队,求最终落下的会有几个团队。

并查集的思想就是,求出来每个人的祖父,将其合并在一起,变成一个祖父;
步骤如下:
1 将每个人的祖父设为自己
2 对于不同的两个人,求出来他们的祖父,将其合并
3 最终求得一共有几个祖父即可

代码实现如下:
例题是力扣547,数组[i][j]表示城市i和城市j是否连同,1代表通,0则不通。其他的也是相同思想。

var parent = map[int]int{}//这个是城市编号都是数组所以是int,如果是人名字符串就是map[string]string
func findCircleNum(isConnected [][]int) int {n := len(isConnected)//初始化,每个城市的中心都是自己for i := range isConnected {parent[i] = i}for i := 0; i < n; i++ {for j := i + 1; j < n; j++ {if isConnected[i][j] == 1 {//i和j连同,就让i和j的祖宗连通iParent := findParent(i)jParent := findParent(j)parent[jParent] = iParent}}}//记录一下一共有几个祖宗,就是分成了几组had := map[int]bool{}for i := range isConnected {p := findParent(i)if !had[p] {had[p] = true}}return len(had)
}
func findParent(kid int) int {for parent[kid] != kid {kid = parent[kid]}return kid
}