HDU1213-How Many Tables 【并查集】
How Many Tables
题意
有N个朋友一起来吃饭,认识的人只跟认识的做一桌,认识的人是可以传递的,A认识B,B认识C,那么A就认识C,问最少需要多少张桌子?
分析
使用并查集模板套一下,最后fa[i] == i的就是一桌,计数器+1即可
AC代码
#include <iostream> #include <stdio.h> using namespace std; typedef long long ll; const int maxn = 1e3+10; int T,N,M; int fa[maxn]; void init(){ for(int i = 1;i<=N;i++) fa[i] = i; } int find(int x){ if(x != fa[x]) fa[x] = find(fa[x]); return fa[x]; } void join(int x,int y){ int fx = find(x),fy = find(y); if(fx != fy){ fa[fx] = fy; } } int main(){ cin>>T; while(T--){ scanf("%d%d",&N,&M); init(); int a,b; while(M--){ scanf("%d%d",&a,&b); join(a,b); } for(int i = 1;i<=N;i++) find(i); int res = 0; for(int i = 1;i<=N;i++) if(fa[i] == i) res++; printf("%d\n",res); } return 0; }