思路:dfs+图论知识
其实,这个完全连通分量我们应该在数据结构中的图论里面学过这个,就算没学过也会根据题意知道这个完全连通分量的边数。
这道题的关键其实就是查找题目中所给的连通分量的边数,和这个连通分量的完全连通分量的边数是否一致,一致就是完全连通分量,不一致就不是。
完全连通分量的计算方法其实就是累加每一个点到达另外一个点的边数。比如,有0,1,2这个连通分量,从0到其他顶点共用了2条边,1到其他顶点也是2条,2也是2条,一共6条边。这个边数就是这一连通分量的完全连通分量的边数。总结起来其实就是n(n-1)/2。
这道题作者其实就是很暴力的做法:
首先用了dfs将所给的连通分量先存储起来,在代码中用的res来存储所有连通分量;
然后,对于每一个连通分量,求出在题目中已给出的边数,统计起来。然后对比这个连通分量是否满足它的完全连通分量边数,用了四重循环来操作。
上代码:
class Solution {
public:
int len;
int ans=0;
void dfs(int u,vector<vector<int>>&s,vector<bool>&st,vector<int>&you){
if(u>=len)return;
for(int i=0;i<s[u].size();i++){
int tmp=s[u][i];
if(!st[tmp]){
st[tmp]=1;
you.push_back(tmp);
dfs(tmp,s,st,you);
}
}
return;
}
int countCompleteComponents(int n, vector<vector<int>>& edges) {
len=n;
vector<bool>st(n,false);
vector<vector<int>>s(n);
for(int i=0;i<edges.size();i++){
int x=edges[i][0];
int y=edges[i][1];
s[x].emplace_back(y);
s[y].emplace_back(x);
}
vector<int>you;
vector<vector<int>>res;
for(int i=0;i<n;i++){
if(!st[i]){
st[i]=1;
you.push_back(i);
dfs(i,s,st,you);
res.push_back(you);
you.clear();
}
}
int ans=0;
for(int i=0;i<res.size();i++){
int counts=0;
for(int j=0;j<res[i].size();j++){
int tmp1=res[i][j];
for(int k=j+1;k<res[i].size();k++){
int tmp2=res[i][k];
for(int t=0;t<edges.size();t++){
int x=edges[t][0];
int y=edges[t][1];
if((tmp1==x&&tmp2==y)||(tmp1==y&&tmp2==x)){
counts+=2;
break;
}
}
}
}
if(counts==(res[i].size()*(res[i].size()-1)))
ans++;
}
return ans;
}
};