前段时间比较忙,今天终于能抽空来好好学学了
并查集
在完成合并和查询操作上有着很大的优势
查询的理想复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
但出现单链的时候会退化到
O
(
n
2
)
O(n^2)
O(n2)
所以我们路径压缩
压缩过后的时间复杂度为恒定的
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) 甚至更低
所以并查集是个好东西
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,f[10100];
int z,x,y;
int find(int cha) //查询+路径压缩
{
if(f[cha]==cha)
return cha;
return f[cha]=find(f[cha]);
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
f[i]=i;
for(int i=1; i<=m; i++)
{
cin>>z>>x>>y;
if(z==1)
f[find(x)]=find(f[y]);
else
{
if(find(x)==find(y))
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
}
return 0;
}