HDU1232

http://acm.hdu.edu.cn/showproblem.php?pid=1232

#include<cstdio>
#include<algorithm>
#define maxn 1001
using namespace std;
int parent[maxn],M,N;

void UFset(int end)
{
    for(int i=1;i<=end;i++)
          parent[i] = -1;
}

int Find(int x)
{
    int s;

    for( s=x; parent[s]>=0; s=parent[s]);
    while (s!=x)
    {
        int tmp;
        tmp=parent[x];
        parent[x]=s;
        x=tmp;
    }
    return s;
}

void Union( int R1, int R2)
{
    int r1 = Find(R1), r2 = Find(R2);
    int tmp =parent[r1]+parent[r2];

    if( parent[r1]>parent[r2])
    {
        parent[r1]=r2;
        parent[r2]=tmp;
    }
    else
    {
        parent[r2]=r1;
        parent[r1]=tmp;
    }
}


int main()
{
    while(~scanf("%d",&N)&&N)
    {
         scanf("%d",&M);
         int roota,rootb,a,b;
         UFset(N);
         for(int i=0;i<M;i++)
         {
             scanf("%d%d",&a,&b);
             roota=Find(a);
             rootb=Find(b);
             if(roota!=rootb)Union(a,b);
         }
         int ans=0;
         //printf("\n");
         for(int i=1;i<=N;i++)
         {
             //printf("%d    ",parent[i]);
             if(parent[i]<0)ans++;
         }
         printf("%d\n",ans-1);
    }

    return 0;
}


發佈了8 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章