并查集小结

并查集

说明:讲图论时正好讲到了呢

对一个集合进行合并,查找

1、把一个一维数组sz的值初始化为其下标

2、若A与B有关系,则sz[A]=B;

3、若A与C有关系 最后,有多少个下标仍是值的数值,就有多少个集合了

#include<iostream>
using namespace std;
int n,m;
const int MAXN=0x3F3F3F;
int f[MAXN];
int init(){//初始化 
    for(int i=1;i<=n;i++)
        f[i]=i;
} 

int getf(int i){
    if(i==f[i]) return i;//没有祖先 
    else return f[i]=getf(f[i]);//有祖先,就把f[i]也变成即将查找到的它的祖先的祖先,状态压缩 
}

void merge(int a,int b){
    int x=getf(a);
    int y=getf(b);
    
    if(x!=y) f[x]=f[y];
}    
int main(){
    int a,b,c;
    cin>>n>>m;
    init(); //初始化
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        f[a]=b;
    }
    
    return 0;
} 

练习

P3367 【模板】并查集

题解点我

P1551 亲戚

题解点我

P2256 一中校运会之百米跑

题解点我(有按秩合并)

更难的题

P1196 [NOI2002]银河英雄传说

 

总结

并查集是一种高效,简洁,神奇的数据结构。它可以快速的处理关系问题,而不必使用O(n2)的暴力搜索。

初学者必学!

posted @ 2019-07-08 16:34  Vanilla_chan  阅读(172)  评论(0编辑  收藏  举报