使用并查集判断一个图是否是连通图
1.源代码如下
#include <cstdio>
#include <vector>
using namespace std;
const int N =1111;
vector <int> G[N];
int father[N] ;
bool isRoot[N];//记录每个节点是否作为某个集合的根节点
int findFather(int x){//找出每个节点的父节点 并且返回
int a = x;
while(x!= father[x]){
x = father[x];
}
return x;
}
void Union(int a ,int b){
int faA = findFather(a);
int faB = findFather(b);
if(faA!=faB){//如果相等 说明节点a 节点b已经在同一个集合中
father[faA] = faB;
}
}
void init(int n){
for(int i = 1;i < N;i++){
father[i] = i;
}
}
int calBlock(int n){
int block = 0;
for(int i = 1;i<= n;i++){
isRoot[findFather(i)] == true;
}
for(int i = 1;i<= n;i++){
block += isRoot[i];//累计根节点的个数
}
return block;
}
int maxH = 0;//最大高度
int main(){
int a,b,n;
scanf("%d",&n);
init(n);
for(int i = 1;i< n;i++){//输入n-1条边
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
Union(a,b);
}
int block = calBlock(n);
if(block!=1) printf("The number of block is %d",block);
else printf("The graph is connected!\n");
}
/**
5
1 3
1 4
2 5
3 4
*/