323 Number of Connected Components in an Undirected Graph (using union find~)
https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/
用bfs当然是可以做的
class Solution {
public int countComponents(int n, int[][] edges) {
Map<Integer, List<Integer>> map = buildGraph(edges);
Set<Integer> visited = new HashSet<>();
int cnt = 0;
for (int i = 0; i < n; i++) {
if (!visited.contains(i)) {
bfs(i, visited, map);
cnt++;
}
}
return cnt;
}
private void bfs(int idx, Set<Integer> visited, Map<Integer, List<Integer>> map) {
Queue<Integer> queue = new ArrayDeque<>();
queue.offer(idx);
while (!queue.isEmpty()) {
int node = queue.poll();
if (visited.contains(node)) {
continue;
}
visited.add(node);
List<Integer> neighbors = map.get(node);
if (neighbors == null) {
continue;
}
for (int nei : neighbors) {
queue.offer(nei);
}
}
}
private Map<Integer, List<Integer>> buildGraph(int[][] edges) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int[] edge : edges) {
List<Integer> listA = map.get(edge[0]);
if (listA == null) {
listA = new ArrayList<>();
}
listA.add(edge[1]);
map.put(edge[0], listA);
List<Integer> listB = map.get(edge[1]);
if (listB == null) {
listB = new ArrayList<>();
}
listB.add(edge[0]);
map.put(edge[1], listB);
}
return map;
}
}
但是这道题可以用union find 感觉可以学习下
public class Solution {
private int find(int[] representative, int vertex) {
if (vertex == representative[vertex]) {
return vertex;
}
return representative[vertex] = find(representative, representative[vertex]);
}
private int combine(int[] representative, int[] size, int vertex1, int vertex2) {
vertex1 = find(representative, vertex1);
vertex2 = find(representative, vertex2);
if (vertex1 == vertex2) {
return 0;
} else {
if (size[vertex1] > size[vertex2]) {
size[vertex1] += size[vertex2];
representative[vertex2] = vertex1;
} else {
size[vertex2] += size[vertex1];
representative[vertex1] = vertex2;
}
return 1;
}
}
public int countComponents(int n, int[][] edges) {
int[] representative = new int[n];
int[] size = new int[n];
for (int i = 0; i < n; i++) {
representative[i] = i;
size[i] = 1;
}
int components = n;
for (int i = 0; i < edges.length; i++) {
components -= combine(representative, size, edges[i][0], edges[i][1]);
}
return components;
}
}
Last updated