并查集一般形式

来源:互联网 发布:虚拟机安装mac os系统 编辑:程序博客网 时间:2024/04/29 03:17
#include<stdio.h>#include<iostream>#include<cstdio>#include<string.h>#include<math.h>using namespace std;//并查集int a[10005];//一般有多少组数据数组开多大;int n,m;void   chushi(){    for(int i=0;i<n;i++)       a[i] = i;}int   getf(int v){    if(a[v]==v)     return v;    else    {        a[v] = getf(a[v]);        return a[v]; //缩短路径,方便下次查找;    }}int  combine(int v1,int v2){    int t1,t2;    t1 = getf(v1);    t2 = getf(v2);//找到t1,t2的父亲;    if(t1!=t2)//如果不相等,合并;    {        a[t2] = t1;//定义左边的为右边的父亲;    }}int main(){    int x,y;    scanf("%d%d",&n,&m);
    chushi();    for(int j=0;j<m;j++)    {        scanf("%d%d",&x,&y);        combine(x,y);    }    int sum = 0;    for(int j=0;j<m;j++)//遍历,看每个树节点的父亲是不是自己;    {        if(a[j]==j)        {            sum++;        }    }    cout<<sum<<endl;    return 0;}