2316. 统计无向图中无法互相到达点对数
思路/代码
基础知识
- 一个结点数为k的连通块,对于其中的每个结点,能到达的结点数为k - 1(连通图内部的其他结点);不能到达的结点数为 n - k(连通图外部的结点)
- 记第 i 个连通图的大小为 ki,则其与第 j 个连通块组成的无法相互到达的点的对数为 ki * kj
思路1:BFS(广度优先搜索)
-
用 bfs 算出图中的所有连通块。
根据连通块的定义,设一个连通块有 k 个点,那么这 k个点无法到达剩下的 (n - k) 个点,组成无法到达的点对就是 k * (n - k)。 -
注意题目中的点对是无序的,而上述统计方法(a, b)和(b,a) 重复计算了。因此最后答案还要除以 2。
class Solution {
//定义结点的个数
#define maxn 100010
//定义边
vector<int> e[maxn];
//vis表示结点是否被访问过,visCnt 访问次数是多少
int vis[maxn], visCnt;
//每个颜色对应的节点有多少个,即连通块的大小(有多少个结点)
int visCount[maxn];
//从u出发,把和u相邻的都染成color
//同一个颜色的代表同一个连同分块
void bfs(int u, int color)
{
queue<int> q;
q.