题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3560
并查集查有几个块,修改了之前我的一个方法(用什么map),直接判断根节点的id是i的个数。
然后成环的判断就是一个筛选,先筛选一个每个节点的度是不是2,要不是的话直接排除(根节点),在查块的时候,进一步查看这个根节点是不是被排除了。
so easy;
#include <stdio.h>
#include <string.h> int father[];
int degree[];
bool vis[]; int Find_Set(int x)
{
if(x!=father[x])
father[x] = Find_Set(father[x]);
return father[x];
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n+m)
{
memset(vis,true,sizeof(vis));
memset(degree,,sizeof(degree)); for(int i=;i<n;i++)
father[i] = i; for(int i=;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
degree[x]++;
degree[y]++; int fx,fy;
fx = Find_Set(x);
fy = Find_Set(y);
if(fx!=fy)
{
father[fy] = fx;
}
} for(int i=;i<n;i++)
{
if(degree[i]!=)
vis[Find_Set(i)] = false;
}
int s = ;
int h = ;
for(int i=;i<n;i++)
{
if(Find_Set(i)==i)
{
s++;
if(vis[i])
h++;
}
} printf("%d %d\n",s,h);
} return ;
}