给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。
请你返回 无法互相到达 的不同 点对数目 。
时间复杂度:O(N)
思路:记录每个几点后续节点,vis记录节点是否已经被访问。使用DFS,记录每个未被访问的点,隐形上就进行了分簇。total记录所有已被遍历的点,size记录簇的大小。则res = res + size*total。
class Solution {
public long countPairs(int n, int[][] edges) {
List<Integer>[] g = new ArrayList[n];
Arrays.setAll(g, e->new ArrayList());
boolean[] vis = new boolean[n];
for(int[] e:edges) {
int x = e[0];
int y = e[1];
g[x].add(y);
g[y].add(x);
}
long total = 0;
long res = 0;
for(int i=0; i<n; i++) {
if(vis[i] == false) {
int size = dfs(i, g, vis);
res = res + total*size;
total = total + size;
}
}
return res;
}
private int dfs(int x, List<Integer>[] g, boolean[] vis) {
int size = 1;
vis[x] = true;
for(int y:g[x]) {
if(vis[y] == false) {
size += dfs(y, g, vis);
}
}
return size;
}
}