前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是七月集训第十七天:广度优先搜素🔥🔥🔥🔥
一、练习题目
二、算法思路
- 1、2316. 统计无向图中无法互相到达点对数:🔥🔥🔥🔥广度优先搜索,染色法。
三、源码剖析
// 2316. 统计无向图中无法互相到达点对数
class Solution {
#define maxn 100010
vector<int> e[maxn];
int vis[maxn], visCnt;
int visCount[maxn];
void bfs(int u, int color) {
queue<int> q;
q.push(u);
vis[u] = color;
while(!q.empty()) {
u = q.front();
q.pop();
for(int i = 0; i < e[u].size(); ++i) {
int v = e[u][i];
if(vis[v] < color) {
vis[v] = color;
q.push(v);
}
}
}
}
public:
long long countPairs(int n, vector<vector<int>>& edges) {
memset(vis, 0, sizeof(vis));
visCnt = 0;
for(int i = 0; i < n; ++i) {
e[i].clear();
}
for(int i = 0; i < edges.size(); ++i) {
int u = edges[i][0];
int v = edges[i][1];
e[u].push_back(v);
e[v].push_back(u);
}
for(int i = 0; i < n; ++i) {
if(!vis[i]) {
bfs(i, ++visCnt);
}
}
for(int i = 0; i < n; ++i) {
++visCount[vis[i]];
}
long long ans = 0;
for(int i = 1; i <= visCnt; ++i) {
ans += (long long)visCount[i] * (n - visCount[i]);
}
return ans / 2;
}
};
- 1、广度优先搜索。