Connected Component in Undirected Graph
Posted flagyuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Connected Component in Undirected Graph相关的知识,希望对你有一定的参考价值。
Description
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.
Clarification
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
思路:无向图连通块, 可以使用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的主要内容,如果未能解决你的问题,请参考以下文章
lintcode431- Connected Component in Undirected Graph- medium
LintCode Find the Weak Connected Component in the Directed Graph
Find the Weak Connected Component in the Directed Graph
[LintCode] Find the Weak Connected Component in the Directed Graph