并查集(啊哈)
并查集:
并查集通过一维数组来实现,其本质是维护一个森林。刚开始的时候,森林中的每一个点都是孤立的,都是一颗只有根节点的树,之后
通过一些条件,逐步将这些树合并成一颗大树,过程Like"认爹",在这个"认爹"过程中,遵循1.靠左原则 2.擒贼先擒王的原则
#include<iostream> using namespace std; int f[1001]; int n,m,k,sum; void init(){ for(int i=1;i<=n;i++){ f[i]=i; } } int getf(int v){ if(f[v]==v){ return v; }else{ f[v]=getf(f[v]); return f[v]; } } void merge(int v,int u){ int t1,t2; t1=getf(v); t2=getf(u); if(t1!=t2){ f[t2]=t1; } } int main(){ int i,x,y; cin>>n>>m; init(); for(int i=1;i<=m;i++){ cin>>x>>y; merge(x,y); } for(int i=1;i<=n;i++){ if(f[i]==i){ sum++; } } cout<<sum<<endl; return 0; }