您的位置:首页 > 其它

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

2015-10-09 10:26 330 查看
请找出有向图中弱联通分量的数目。图中的每个节点包含其邻居的 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: