RainbowSheep_ @ 2024-11-25 21:59:31
为什么merge写s[x]=find(y);会20pts wa 而s[find(x)]=find(y);就能ac? 附代码:
//https://www.luogu.com.cn/problem/P3367
#include <iostream>
using namespace std;
#define MAX 10010
int s[MAX],n,m,op,x,y;
int find(int x)
{
if(s[x]!=x)
s[x]=find(s[x]);
return s[x];
}
inline void merge(int x,int y)
{
s[find(x)]=find(y);
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i = 1;i<=n;i++)
s[i]=i;
while(m--)
{
cin >> op >> x >> y;
switch(op)
{
case 1:
merge(x,y);
break;
default:
cout << (find(x)==find(y)?'Y':'N') << endl;
}
}
return 0;
}
by cj180202 @ 2024-11-25 22:05:59
如果当前 x 不是集合根结点那么直接连完后 x 上面的祖先会和 x 分裂开
by 南苑 @ 2024-11-25 22:07:42
如图,前者你会把x结点直接和top链接,但z结点却不能合并。(绘画技术不好,轻喷qwq)