并查集 DisJoint
检查图上是否存在环
通过一个数组表示每个点的父节点地址
通过查询每个节点的父节点是否相同判断是否是同一个集合
核心两个方法:
1.找到根节点
2.合并两个集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public class Disjoint {
public static void main(String[] args) { int[][] edges = { {0,1},{1,2},{1,3}, {3,2},{2,4} }; int len = (int) 1e5; int[] parents = new int[len]; Arrays.fill(parents,-1); // 初始化
// xxxx 其他操作
for (int[] edge:edges) { int x = edge[0]; int y = edge[1]; if(union(x,y,parents)){ // 如果是相同的的父节点 说明已经是同一个集合 // 再加入就是环了!!! System.out.println("find cycle."); return; } } System.out.println("not find cycle."); }
// 查找根节点 public static int find_root(int x, int[] parents){ int x_root = x; while (parents[x_root] != -1){ x_root = parents[x_root]; } return x_root; }
// 合并两个集合 public static boolean union(int x,int y,int[] parents){ int x_root = find_root(x,parents); int y_root = find_root(y,parents); if(x_root != y_root){ parents[x_root] = y_root; // 将x合并到y中 return false; }else return true; } }
|