标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3560
并查集查有几个块,修改了之前我的一个方法(用什么map),直接判断根节点的id是i的个数。
然后成环的判断就是一个筛选,先筛选一个每个节点的度是不是2,要不是的话直接排除(根节点),在查块的时候,进一步查看这个根节点是不是被排除了。
so easy;
#include <stdio.h> #include <string.h> int father[100010]; int degree[100010]; bool vis[100010]; 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,0,sizeof(degree)); for(int i=0;i<n;i++) father[i] = i; for(int i=0;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=0;i<n;i++) { if(degree[i]!=2) vis[Find_Set(i)] = false; } int s = 0; int h = 0; for(int i=0;i<n;i++) { if(Find_Set(i)==i) { s++; if(vis[i]) h++; } } printf("%d %d\n",s,h); } return 0; }
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5721671.html