|
| 1 | +package ca.mcmaster.chapter.four.graph; |
| 2 | + |
| 3 | +import java.io.File; |
| 4 | +import java.io.FileInputStream; |
| 5 | +import java.io.FileNotFoundException; |
| 6 | + |
| 7 | +public class UFSearch extends AbstractSearch { |
| 8 | + private final UF uf; |
| 9 | + public UFSearch(Graph g, int s) { |
| 10 | + super(g, s); |
| 11 | + this.uf = new UF(g.V()); |
| 12 | + //Insert connections into the UF. |
| 13 | + for(int v = 0; v < g.V(); v++){ |
| 14 | + for(int w : g.adj(v)){ |
| 15 | + if(uf.connected(v, w)) continue; |
| 16 | + else uf.union(v, w); |
| 17 | + } |
| 18 | + } |
| 19 | + } |
| 20 | + |
| 21 | + @Override |
| 22 | + public boolean mark(int v) { |
| 23 | + return uf.connected(super.s, v); |
| 24 | + } |
| 25 | + |
| 26 | + @Override |
| 27 | + public int count() { |
| 28 | + return uf.size[super.s]; |
| 29 | + } |
| 30 | + private final class UF{ |
| 31 | + private final int N; |
| 32 | + private final int[] a; |
| 33 | + private final int[] size; |
| 34 | + public UF(int N){ |
| 35 | + this.N = N; |
| 36 | + a = new int[N]; |
| 37 | + for(int i = 0; i < N; i++) a[i] = i; |
| 38 | + size = new int[N]; |
| 39 | + for(int i = 0; i < N; i++) size[i] = 1; |
| 40 | + } |
| 41 | + public int find(int v){ |
| 42 | + if(a[v] == v) return v; |
| 43 | + else return find(a[v]); |
| 44 | + } |
| 45 | + public void union(int p, int q){ |
| 46 | + int qRoot = find(q); |
| 47 | + int pRoot = find(p); |
| 48 | + if(pRoot == qRoot) return; |
| 49 | + if(size[qRoot] < size[pRoot]){ |
| 50 | + a[qRoot] = pRoot; |
| 51 | + size[pRoot] += size[qRoot]; |
| 52 | + }else{ //size[qRoot] >= size[pRoot] |
| 53 | + a[pRoot] = qRoot; |
| 54 | + size[qRoot] += size[pRoot]; |
| 55 | + } |
| 56 | + } |
| 57 | + public boolean connected(int p, int q){ |
| 58 | + return find(q) == find(p); |
| 59 | + } |
| 60 | + } |
| 61 | + |
| 62 | + public static void main(String[] args) throws FileNotFoundException { |
| 63 | + Graph g = new UndirectedGraph(new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyG.txt"))); |
| 64 | + Search search = new UFSearch(g, 9); |
| 65 | + System.out.println(search.mark(4)); |
| 66 | + } |
| 67 | +} |
0 commit comments