How Many Tables——并查集模板题
题意:
n个人参加晚宴;完全不认识的两个人不能被分配在同一餐桌;认识具有传递性:A认识B B认识C,那么A和C也认识.
题解:
将认识两个人合并到同一集合;最后统计有多少个不同的集合即可;
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; typedef long long ll; const int maxn=5e5+5; int f[maxn]; int n,m; int num[maxn]; int a[maxn]; int Find(int x) { return x==f[x]?x:f[x]=Find(f[x]); } void join(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy) { f[fx]=fy; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)f[i]=i; while(m--) { int x,y; scanf("%d%d",&x,&y); join(x,y); } int ans=0; for(int i=1;i<=n;i++)if(f[i]==i)ans++; printf("%d\n",ans); } return 0; }