从现在开始每天至少刷一道题。
题库:lintcode
有些题目链接打不开,需要权限,那大家就去九章算法参考答案里找找。
431. Connected Component in Undirected Graph
题目链接
难度:medium
算法:bfs
解题思路
遍历节点数组nodes中的节点,如果节点没有被访问过,说明这个节点在一个新的连接块(Connected Component)上,新建一个数组存储该连接块中的节点。通过bfs获取与该节点连接在一起的所有节点。
注意在同一个连接块中的节点按照label升序排列。怎么实现呢?
思
考
5
秒
用priorityqueue实现最小堆,把queue poll出来的节点存到最小堆里,再用一个数组存最小堆poll出来的结果,实现排序。
时间复杂度:O(V + E),
空间复杂度:O(V), visited数组存储每个节点是否被访问过O(V)。队列,数组存储每个连接块上的节点个数,均小与等于 V。
解法
/**
* Definition for Undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
/*
* @param nodes: a array of Undirected graph node
* @return: a connected set of a Undirected graph
*/
public List<List<Integer>> connectedSet(List<UndirectedGraphNode> nodes) {
// write your code here
if(nodes == null || nodes.size() == 0){
return new ArrayList<>();
}
Map<Integer, UndirectedGraphNode> nodeMap = new HashMap<>();
for(UndirectedGraphNode node: nodes){
nodeMap.put(node.label, node);
}
//begin with one node and find all nodes in a connected component
Set<Integer> visited = new HashSet<>();
List<List<Integer>> result = new ArrayList<>();
for(int i=0;i<nodes.size();i++){
if(visited.contains(nodes.get(i).label)){
continue;
}
//store all nodes in the connected component
Queue<Integer> component = new PriorityQueue<>();