并查集

Dev.C++并查集:在集合中,你要查某人的霸霸祖先,暴力就会显得很慢,于是,并查集出现了~~~
老规矩,先贴……不,这次贴道极难的模板题,请看

贴上我的TLE(不你们什么也没有看到)代码


#include<bits/stdc++.h>
using namespace std;
int fa[10100],n,m;
int find(int x) {
    if (fa[x]==x)return x;
    else return find(fa[x]); 
}
void union_(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)return;
    fa[x]=y; 
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)fa[i]=i;
	while(m--)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		if(x==1)union_(y,z);
		else
		{
			if(find(y)==find(z))cout<<"Y"<<endl;
			else cout<<"N"<<endl;
		}
	}
	return 0;
}

变量解释:fa:的记录某个人爸爸是谁,特别规定,祖先的爸爸是他自己


int find(int x) {
    if (fa[x]==x)return x;
    else return find(fa[x]); 
}

find(x):查找x的祖宗(即“根”)
定义:特别规定,祖先的爸爸是他自己,所以出现了if (fa[x]==x)return x;。
否则就找他的祖先: else return find(fa[x]);


void union_(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)return;
    fa[x]=y; 
}

union_(x,y):合并x和y所在的集合
合并集合,就让这两个集合的霸霸祖宗相认(一个人认另一个人为霸霸),所以要 x=find(x);y=find(y);
如果他俩是一家人,也就是说他们的祖宗是同一个人,就不管他啦,所以有if(x==y)return;
否则就相认fa[x]=y;
这个代码主要部分就ok了!


结论:其实并查集同样是个模板,像高精度一样(不知道高精度的戳这),所以

还是那句话:最好背下来哦!

posted @ 2020-08-06 16:41  riced  阅读(109)  评论(0编辑  收藏  举报