1. 程式人生 > >基於簡單的路徑壓縮的並查集演算法

基於簡單的路徑壓縮的並查集演算法

void merge(int fir,int sec) 
{
    int i=fir,j=sec;
    while(person[i].parent!=i)
    {
        person[i].parent=person[person[i].parent].parent;
        i=person[i].parent;
    }
    while(person[j].parent!=j)
    {
        person[j].parent=person[person[j].parent].parent;
        j=person[j].parent;
    }
    if(i!=j)
    {
        if(person[i].nodenum>person[j].nodenum)
        {
            person[j].parent=i;
            person[i].nodenum+=person[j].nodenum;
            sum--;
        }
        else
        {
            person[i].parent=j;
            person[j].nodenum+=person[i].nodenum;
            sum--;
        }
    }
}


int main()
{
    int n,m;
    int first,second;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
          person[i].parent=i,person[i].nodenum=1;
        sum=n;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&first,&second);
            merge(first,second);
        }
        printf("%d\n",sum);
    }
    return 0;
}