How Many Tables HDU - 1213
考察: 并查集基础
和前面suspects差不多的题目,就是将计算集合内人数换成计算集合个数,用数组标记集合的编号即可
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int N = 1010; 6 int p[N],vis[N]; 7 int findf(int x) 8 { 9 if(p[x]!=x) p[x] = findf(p[x]); 10 return p[x]; 11 } 12 int main() 13 { 14 // freopen("in.txt","r",stdin); 15 int t; 16 scanf("%d",&t); 17 while(t--) 18 { 19 int n,m,ans = 0; 20 fill(vis,vis+N,0); 21 scanf("%d%d",&n,&m); 22 for(int i=1;i<=n;i++) p[i] = i; 23 for(int i=1;i<=m;i++){ 24 int x,y; scanf("%d%d",&x,&y); 25 int px = findf(x); int py = findf(y); 26 p[py] = px; 27 } 28 for(int i=1;i<=n;i++){ 29 if(!vis[findf(i)]) ans++; 30 vis[findf(i)] = 1; 31 } 32 printf("%d\n",ans); 33 } 34 return 0; 35 }