找出有向图中的弱联通分量

来源:互联网 发布:淘宝企业店铺如何更换 编辑:程序博客网 时间:2024/04/28 17:00

请找出有向图中弱联通分量的数目。图中的每个节点包含其邻居的 1 个标签和1 个列表。 (一个有向图中的相连节点指的是一个包含 2 个通过直接边沿路径相连的顶点的子图。)

您在真实的面试中是否遇到过这个题? 
Yes
样例

给定图:

A----->B  C \     |  |   \    |  |   \   |  |    \  v  v     ->D  E <- F

返回 {A,B,D}, {C,E,F}. 图中有 2 个相连要素,即{A,B,D} 和 {C,E,F}

挑战

将原素升序排列。

解法:

采用并查集

import java.util.Map.Entry;/** * Definition for Directed graph. * class DirectedGraphNode { *     int label; *     ArrayList<DirectedGraphNode> neighbors; *     DirectedGraphNode(int x) { label = x; neighbors = new ArrayList<DirectedGraphNode>(); } * }; */public class Solution {    /**     * @param nodes a array of Directed graph node     * @return a connected set of a directed graph     */    public List<List<Integer>> connectedSet2(ArrayList<DirectedGraphNode> nodes)    {        Map<Integer, Integer> father = new HashMap<Integer, Integer>();        for(DirectedGraphNode curNode : nodes) {            for(DirectedGraphNode curNNode : curNode.neighbors) {                int curP = find(father, curNode.label);                int curNP = find(father, curNNode.label);                if(curP != curNP) {                    if(curP > curNP) {                        father.put(curP, curNP);                    }                    else {                        father.put(curNP, curP);                    }                }            }        }        Map<Integer, List<Integer>> tMap = new HashMap<Integer, List<Integer>>();        for(DirectedGraphNode curNode : nodes) {            int curF = find(father, curNode.label);            if(!tMap.containsKey(curF)) {                List<Integer> tmpList = new ArrayList<Integer>();                tmpList.add(curNode.label);                tMap.put(curF, tmpList);            }            else {                tMap.get(curF).add(curNode.label);            }        }        List<List<Integer>> ans = new ArrayList<List<Integer>>();        Set<Entry<Integer, List<Integer>>> entrySet = tMap.entrySet();        for(Entry<Integer, List<Integer>> curEntry : entrySet) {            ans.add(curEntry.getValue());        }        return ans;    }        private int find(Map<Integer, Integer> father, int cur) {        if(!father.containsKey(cur)) {            father.put(cur, cur);            return cur;        }        while(father.get(cur) != cur) {            cur = father.get(cur);        }        return cur;    }}


0 0
原创粉丝点击