邻接表
//计算联通块的数量
for(int i = 1;i <= n;++i){
if(!id[i]){
dfs(i,++bcnt);
}
}
void dfs(int u,int bid){ //u为节点编号,bid为连通块编号
id[u] = bid;
block[bid].push_back(u);
for(int i = h[u];i != -1;i = ne[i]){
int j = e[i];
if(!id[j]){
dfs(j,bid);
}
}
}
邻接矩阵
void dfs(int u,int bid){ //bid为连通块的编号
if(u > n) return;
id[ids] = u;
block[ids].push_back(u);
for(i = u;i <= n;++i){
for(int j = u + 1;j <= n;++j){
if(!id[u] && g[i][j] == 1){
dfs(i,bid);
}
}
}
}
int cnt = 0;
for(int i = 1;i <= n;++i){
if(!id[i]){
dfs(i,cnt++);
}
}