并查集小结
并查集
说明:讲图论时正好讲到了呢
对一个集合进行合并,查找
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)的暴力搜索。
初学者必学!