前言:并查集是用来解决 “朋友的朋友也是朋友” 类的问题,其实写三个函数就能解决大部分题
//重点的三个函数(核心部分)
int fa[N];
void init(){ //初始化
for(int i = 0; i < N; i++)
fa[i] = i;
}
int findfa(int x){ //找到某个数x的祖先
return x == fa[x] ? x : (fa[x] = findfa(fa[x]));
}
void Union(int x, int y){ //把x和y合并(二者之间连一条线)
int fx = findfa(x), fy = findfa(y);
if(fx != fy) fa[fx] = fy; //注意是fa[fx]=fy, 而不是fa[x]=fy; 当然了fa[fy]=fx也行
}
//找连通分支数(或者说是不同的圈子数)
int cnt = 0;
for(int i = 1; i <= people; i++)
if(findfa(i) == i) cnt++;
//判断任意两个元素是否属于同一个圈子
if(findfa(x)== findfa(y)) printf("Y\n");
else printf("N\n");
//查找某个点所在连通分支中点的个数
cout << num[findfa(a)] << endl;