leetcode03. Find the Weak Connected Component in the Directed Graph

来源:互联网 发布:键盘 编程 编辑:程序博客网 时间:2024/06/07 18:43

解法

UnionFind

/** * @Author RenXintao * @Date 9/20/17 * @method: UnionFind */class UnionFind {    HashMap<Integer, Integer> father = new HashMap<>();    UnionFind(HashSet<Integer> hashSet) {        for (Integer now : hashSet) {            father.put(now, now);        }    }    int find(int x) {        int parent = father.get(x);        while (parent != father.get(parent)) {            parent = father.get(parent);        }        return parent;    }    int compressed_find(int x) {        int parent = father.get(x);        while (parent != father.get(parent)) {            parent = father.get(parent);        }        int next;        while (x != father.get(x)) {            next = father.get(x);            father.put(x, parent);            x = next;        }        return parent;    }    void union(int x, int y) {        int fa_x = father.get(x);        int fa_y = father.get(y);        if (fa_x != fa_y) {            father.put(fa_x, fa_y);        }    }}public class FindTheConnectedComponentInTheUndirectedGraph_lint_3_1 {    List<List<Integer>> print(HashSet<Integer> hashSet, UnionFind uf, int n) {        List<List<Integer>> ans = new ArrayList<List<Integer>>();        HashMap<Integer, List<Integer>> hashMap = new HashMap<Integer, List<Integer>>();        for (int i : hashSet) {            int fa = uf.find(i);            if (!hashMap.containsKey(fa)) {                hashMap.put(fa, new ArrayList<Integer>());            }            List<Integer> now = hashMap.get(fa);            now.add(i);            hashMap.put(fa, now);        }        for (List<Integer> now : hashMap.values()) {            Collections.sort(now);            ans.add(now);        }        return ans;    }    public List<List<Integer>> connnectedSet(ArrayList<UndirectedGraphNode> nodes) {        HashSet<Integer> hashSet = new HashSet<>();        for (UndirectedGraphNode now : nodes) {            hashSet.add(now.label);            for (UndirectedGraphNode neighbour : now.neighbors) {                hashSet.add(neighbour.label);            }        }        UnionFind uf = new UnionFind(hashSet);        for (UndirectedGraphNode now : nodes) {            for (UndirectedGraphNode neighbour : now.neighbors) {                int fnow = uf.find(now.label);                int fneighbour = uf.find(neighbour.label);                if (fnow != fneighbour) {                    uf.union(now.label, neighbour.label);                }            }        }        return print(hashSet, uf, nodes.size());    }}