hdu 3560 Graph’s Cycle Component

#include <stdio.h>
#include <string.h>

 

#define MAXN 100005

int father[MAXN],de[MAXN];
bool iscyle[MAXN];

int find(int x)
{
    int i,t;
    for(i=x;father[i]>=0;i=father[i]) ;
    while(x!=i)
    {
        t=father[x];
        father[x]=i;
        x=t;
    }
    return i;
}
void merge(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx==fy) return;
    if(father[fx]>father[fy])
    {
        father[fy]+=father[fx];
        father[fx]=fy;
    }
    else
    {
        father[fx]+=father[fy];
        father[fy]=fx;
    }
}

int main()
{
    int n,m,i,j;
    while(scanf("%d %d",&n,&m),n+m)
    {
        memset(father,-1,sizeof(*father)*(n+1));
        memset(iscyle,true,sizeof(*iscyle)*(n+1));
        memset(de,0,sizeof(*de)*(n+1));
        while(m--)
        {
            scanf("%d %d",&i,&j);
            de[i]++;
            de[j]++;
            merge(i,j);
        }
        for(i=0;i<n;i++)
        {
            if(de[i]!=2) iscyle[find(i)]=false;
        }
        int com=0,cycle=0;
        for(i=0;i<n;i++)
        {
            j=find(i);
            if(j == i)
            {
                com++;
                if(iscyle[j]) cycle++;
            }
        }
        printf("%d %d\n",com,cycle);
    }
    return 0;
}

posted @ 2010-09-05 18:05  菜到不得鸟  阅读(182)  评论(0)    收藏  举报