并查集

并查集模板(不带权)

#include<iostream>
#include<algorithm>
#include<map>

using  namespace std;

const int maxn=1100;
bool vis[maxn];

int fa[maxn];

int fi(int x){
    return fa[x]==x?x:fa[x]=fi(fa[x]);
}

void Union(int x,int y){
    int p1=fi(x),p2=fi(y);
    if(p1==p2)return ;
    fa[p1]=p2;
}

int main(){
    ios::sync_with_stdio(false);
    int T;cin>>T;
    while(T--){
        int n,m;cin>>n>>m;
        fill(vis,vis+maxn,0);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        for(int i=1;i<=m;i++){
            int x,y;cin>>x>>y;
            Union(x,y);
        }
        int cnt=0;
        for(int i=1;i<=n;i++){
            int x=fi(i);
           // cout<<x<<endl;
            if(!vis[x]){
                vis[x]=1;
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

 

posted @ 2018-07-13 15:15  ___292  阅读(106)  评论(0编辑  收藏  举报