并查集

OI复建自娱产物

并查集是一种支持集合合并、查询元素所属集合的数据结构。

用例题可以更容易地理解并查集的概念。

例题:洛谷P1551(直接写了路径压缩)

#include<bits/stdc++.h>
#define N 5001
using namespace std;
int n,m,p,a,b,f[N];
int find(int n){
    if(n==f[n]) return n;
    return f[n]=find(f[n]);
}
void merge(int a,int b){
    f[find(a)]=find(b);  //f[find(a)]=b 会 MLE?
    return;
}
int main(){
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++)
        f[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        merge(a,b);
    }
    for(int i=1;i<=p;i++){
        scanf("%d%d",&a,&b);
        if(find(a)==find(b)) printf("Yes\n");
        else printf("No\n");
    }
}

发现merge函数中,如果写 f [ find ( a ) ] = find ( b ) 会导致MLE。

推测是递归树太大导致占用空间超限。

 

题外话:路径压缩算法的时间复杂度是多少?

(查了半天也没查到确定的答案)

 

挖坑:以后在这里写一下P3958和P1525的题解

posted @ 2023-10-11 11:03  key4127  阅读(15)  评论(0)    收藏  举报