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了!