431. Connected Component in Undirected Graph
中文English
Find connected component in undirected graph.
Each node in the graph contains a label and a list of its neighbors.
(A connected component of an undirected graph is a subgraph in which any two vertices are connected to each other by paths, and which is connected to no additional vertices in the supergraph.)
You need return a list of label set.
Example
Example 1:
Input: {1,2,4#2,1,4#3,5#4,1,2#5,3}
Output: [[1,2,4],[3,5]]
Explanation:
1------2 3
\ | |
\ | |
\ | |
\ | |
4 5
Example 2:
Input: {1,2#2,1}
Output: [[1,2]]
Explanation:
1--2
Clarification
Notice
Nodes in a connected component should sort by label in ascending order. Different connected components can be in any order.
/**
* 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
List<List<Integer>> ans = new ArrayList<>();
if (nodes == null || nodes.size() == 0) {
return ans;
}
Map<UndirectedGraphNode, List<UndirectedGraphNode>> adjList = new HashMap<>();
for (UndirectedGraphNode node : nodes) {
adjList.put(node, node.neighbors);
}
Set<UndirectedGraphNode> visited = new HashSet<>();
for (UndirectedGraphNode node : nodes) {
if (!visited.contains(node)) {
List<Integer> cc = bfs(adjList, node, visited);
ans.add(cc);
}
}
return ans;
}
private List<Integer> bfs(Map<UndirectedGraphNode, List<UndirectedGraphNode>> adjList, UndirectedGraphNode node, Set<UndirectedGraphNode> visited) {
List<Integer> ans = new ArrayList<>();
Queue<UndirectedGraphNode> queue = new LinkedList<>();
queue.offer(node);
visited.add(node);
while (!queue.isEmpty()) {
UndirectedGraphNode v = queue.poll();
ans.add(v.label);
for (UndirectedGraphNode neighbor : adjList.get(v)) {
if (visited.contains(neighbor)) {
continue;
}
queue.offer(neighbor);
visited.add(neighbor);
}
}
Collections.sort(ans);
return ans;
}
}
No comments:
Post a Comment