#include<iostream>
using namespace std;
int pre[1050]; //保存节点的直接父节点
//查找x的根节点
int find(int a){
if(pre[a]!=a)
pre[a]=find(pre[a]);//路径压缩,本结点更新为根结点的子结点
return pre[a];
}
//连接两个连通块
void join(int x,int y) {
int fx=Find(x),fy=Find(y);
if(fx!=fy) pre[fy]=fx;
}
int main() {
int N,M,a,b,i,j,ans=0;
while(scanf("%d%d",&N,&M) && N) {
//初始化pre数组
for(i=1;i<=N;i++) pre[i]=i;
//根据连通情况,构建pre数组
for(i=1;i<=M;i++) {
scanf("%d%d",&a,&b);
join(a,b);
}
for(i=1;i<=N;i++)
if(pre[i]==i) ans++; //计算连通子图的个数ans
cout<<ans;
return 0;
}
并查集判断连通块个数
最新推荐文章于 2025-05-12 19:59:39 发布