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 }

 

posted @ 2021-01-03 10:45  acmloser  阅读(122)  评论(0编辑  收藏  举报