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;
}
浙公网安备 33010602011771号