并查集
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的题解