玄学提问

P3367 【模板】并查集

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)


|