并查集-F - How Many Tables

F - How Many Tables

并查集的模板都能直接套,太简单不注释了,就存个代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int size = 1010;
 5 int parent[size];
 6 int cnt[1005];
 7 int t, n, m, x, y, num;
 8 
 9 
10 //赋初值 
11 void parentkey(int n){
12     for(int i=1;i<=n;i++){
13         parent[i] = i;
14         cnt[i] = 0;    
15     }    
16 }
17 
18 //找根节点
19 int find(int x){
20     return x==parent[x]? x : parent[x]=find(parent[x]);
21 } 
22 
23 //合并 
24 void parent_union(int x,int y){
25     int fx = find(x);
26     int fy = find(y);
27     parent[fy] = fx;
28 }
29 
30 int number(int x){
31     int num = 0;
32     int fx = find(x);
33     for(int i=0;i<size;i++){
34         if(fx==find(i))
35             num++;
36     }
37     return num;
38 }
39 
40 int main(){
41     scanf("%d",&t);
42     while(t--){
43         scanf("%d %d",&n ,&m);
44         parentkey(n);
45         num = 0;
46         for(int i=0; i<m; i++){
47             scanf("%d %d",&x, &y);
48             parent_union(x, y);
49         }
50         for(int i=1; i<=n; i++){
51             cnt[find(i)]++;
52         }for(int i=1; i<=n; i++)
53             if(cnt[i])
54                 num ++;
55         printf("%d\n",num);        
56     }
57     
58 }

猜你喜欢

转载自www.cnblogs.com/0424lrn/p/12221024.html