7月算法训练------第十七天(广度优先搜索)解题报告
题目类型:广度优先搜索
题目难度:简单
第一题、2316. 统计无向图中无法互相到达点对数
- 题目链接:2316. 统计无向图中无法互相到达点对数
- 思路分析:
运用DFS,求出每个连通块的大小,同时求出变量维护前面求出的连通块之和,与当前求出的连通块之和计算乘积,然后做累加,就是答案。
比如:题目中的例子:
n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
我们通过画图可知图中连通块为[0, 2, 4, 5],[3],[1, 6],连通块个数位4,1,2;
则计算过程就是: 0 × 0 + 1 × ( 0 + 4 ) + 2 × ( 0 + 4 + 1 ) = 14 0\times0+1\times(0+4)+2\times(0+4+1)=14 0×0+1×(0+4)+2×(0+4+1)=14
注意用法Arrays.setAll()
方法。这种思路确实不好想。 - 代码:
class Solution {
List<Integer>[] g;
boolean[] vis;
int cnt;
public long countPairs(int n, int[][] edges) {
g = new ArrayList[n];
Arrays.setAll(g, e -> new ArrayList<>());
for (int[] e : edges) {
int x = e[0], y = e[1];
g[x].add(y);
g[y].add(x);
}
vis = new boolean[n];
long ans = 0L;
for (int i = 0, tot = 0; i < n; ++i)
if (!vis[i]) {
cnt = 0;
dfs(i);
ans += (long) cnt * tot;
tot += cnt;
}
return ans;
}
void dfs(int x) {
vis[x] = true;
++cnt;
for (int y : g[x]) if (!vis[y]) dfs(y);
}
}