LeetCode 2685. 统计完全连通分量的数量 C#
原题链接
中等
作者:
hpstory
,
2023-05-15 22:39:50
,
所有人可见
,
阅读 140
C# DFS 代码
public class Solution {
private int e, v;
public int CountCompleteComponents(int n, int[][] edges) {
List<List<int>> graph = new List<List<int>>();
for (int i = 0; i < n; i++){
graph.Add(new List<int>());
}
foreach (int[] edge in edges){
graph[edge[0]].Add(edge[1]);
graph[edge[1]].Add(edge[0]);
}
int result = 0;
bool[] visited = new bool[n];
for (int i = 0; i < n; i++){
if (!visited[i]){
e = 0;
v = 0;
DFS(i);
if (e == v * (v - 1)) result++;
}
}
return result;
void DFS(int x){
v++;
e += graph[x].Count;
visited[x] = true;
foreach (int y in graph[x]){
if (!visited[y]){
DFS(y);
}
}
}
}
}
C# 并查集 代码
public class Solution {
public int CountCompleteComponents(int n, int[][] edges) {
List<List<int>> graph = new List<List<int>>();
for (int i = 0; i < n; i++){
graph.Add(new List<int>());
}
foreach (int[] edge in edges){
graph[edge[0]].Add(edge[1]);
graph[edge[1]].Add(edge[0]);
}
int[] p = new int[n];
int[] count = new int[n];
for (int i = 0; i < n; i++){
p[i] = i;
count[i] = 1;
}
foreach (int[] edge in edges){
int a = edge[0], b = edge[1];
if (find(a) == find(b)) continue;
count[find(b)] += count[find(a)];
p[find(a)] = find(b);
}
int result = 0;
Dictionary<int, HashSet<int>> dict = new Dictionary<int, HashSet<int>>();
for (int i = 0; i < n; i++){
int x = find(i);
if (!dict.ContainsKey(x)) dict.Add(x, new HashSet<int>());
dict[x].Add(i);
}
foreach (var kv in dict){
int v = count[kv.Key];
int e = kv.Value.Sum(i => graph[i].Count);
if (e == v * (v - 1)) result++;
}
return result;
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
}
}