标签:class more wrap inf output nat ble one nta
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.
Nodes in a connected component should sort by label in ascending order. Different connected components can be in any order.
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
思路:无向图连通块, 可以使用BFS或者并查集union find求解 .
/** * Definition for Undirected graph. * class UndirectedGraphNode { * int label; * ArrayList<UndirectedGraphNode> neighbors; * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } * }; */ public class Solution { class UnionFind { HashMap<Integer, Integer> father = new HashMap<Integer, Integer>(); 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 = find(x); int fa_y = find(y); if (fa_x != fa_y) father.put(fa_x, fa_y); } } 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> > connectedSet(List<UndirectedGraphNode> nodes) { // Write your code here HashSet<Integer> hashSet = new HashSet<Integer>(); 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()); } }
Connected Component in Undirected Graph
标签:class more wrap inf output nat ble one nta
原文地址:https://www.cnblogs.com/FLAGyuri/p/12078607.html