[LeetCode] 323. Number of Connected Components in an Undirected Graph 無向圖中的連通區域的個數
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.
Example 1:
0 3
| |
1 --- 2 4
Given n = 5 and edges = [[0, 1], [1, 2], [3, 4]], return 2.
Example 2:
0 4
| |
1 --- 2 --- 3
Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [3, 4]], return 1.
Note:
You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
這道題和numbers of islands II 是一個思路,一個count初始化為n,union find每次有新的edge就union兩個節點,如果兩個節點(u, v)原來不在一個連通圖裏面就減少count並且連起來,如果原來就在一個圖裏面就不管。用一個索引array來做,union find優化就是加權了,每次把大的樹的root當做parent,小的樹的root作為child。
Java:
public class Solution { public int countComponents(int n, int[][] edges) { int count = n; // array to store parent init(n, edges); for(int[] edge : edges) { int root1 = find(edge[0]); int root2 = find(edge[1]); if(root1 != root2) { union(root1, root2); count--; } } return count; } int[] map; private void init(int n, int[][] edges) { map = new int[n]; for(int[] edge : edges) { map[edge[0]] = edge[0]; map[edge[1]] = edge[1]; } } private int find(int child) { while(map[child] != child) child = map[child]; return child; } private void union(int child, int parent) { map[child] = parent; } }
[LeetCode] 323. Number of Connected Components in an Undirected Graph 無向圖中的連通區域的個數