在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个用于此数据结构的操作:
有如图所示
(1)将每个节点的祖宗设为自己:
(2)找到每个节点的最开始的祖宗
(3)进行路径压缩合并,将连在一起的,把左面作为右边的祖宗
以下是代码演示:
#include<bits/stdc++.h> using namespace std; int f[1005]; int pos[10005]; int n,m,sum=0; void Init(int n) //初始化函数,将每个节点将自己设为祖宗节点 { for(int i=1;i<=n;i++) { f[i]=i; } return; } int ptr_get(int x) //查询该节点的祖宗节点 { if(f[x]==x) return x; else return ptr_get(f[x]); } void ptr_merge(int x,int y) //将两个节点进行合并,以左边的节点作为祖宗(每次输入的时候) { int t1,t2; t1=ptr_get(x); t2=ptr_get(y); if(t1!=t2) { f[t2]=t1; } return; } int main() //主函数 { int i,x,y; int count=0; cin>>n>>m; Init(n); for(i=1;i<=n;i++) { cin>>x>>y; ptr_merge(x,y); } for(i=1;i<=m;i++) { if(f[i]==i) count++; } cout<<count<<endl; }