题目来源于知识星球—英雄算法联盟,七月算法集训专题
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
今天只有一题!
一、2316.统计无向图中无法互相到达点对数(中等)
1.题目描述
2.解题思路
对题目给定的图,求出它的连通分块。假设共有n个节点,加入每个连通
分块的节点个数分别为a、b、c......,那么不相连的总的点对数为a*(n-a)
+b*(n-b)+c*(n-c)...,利用广度优先搜索求出每个连通分块后,再计算。
3.代码演示(C++)
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;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!