// LLP-Kruskal: edge-inclusion lattice driven by union-find. class LLPKruskal { boolean[] LLPKruskal(int[] u, int[] v, int[] parent) { boolean[] C = false; forbidden (j) : !C[j] && find(u[j], parent) != find(v[j], parent) => advance : { C[j] = true; union(u[j], v[j], parent); }; return C; } // Iterative find with path-halving. int find(int x, int[] parent) { while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; }; return x; } // Union by simple link of the roots; idempotent on already-merged sets. void union(int a, int b, int[] parent) { int ra = find(a, parent); int rb = find(b, parent); if (ra != rb) { parent[ra] = rb; } } }