【HDU1231】How Many Tables(并查集基础题)

什么也不用说,并查集裸题,直接盲敲即可。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <cctype>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <numeric>
 9 using namespace std;
10
11 int father[1005];
12
13 int getFather (int x) {
14     if (x != father[x]) {
15         father[x] = getFather(father[x]);
16     }
17     return father[x];
18 }
19
20 void Union (int p, int q) {
21     int x = getFather (p);
22     int y = getFather (q);
23     if (x != y) {
24         father[y] = x;
25     }
26 }
27
28 void Init (int n) {
29     for (int i = 1 ; i <= n; ++ i) {
30         father[i] = i;
31     }
32 }
33
34 int main () {
35     int T; cin >> T;
36     while (T --) {
37         int n, op_n;
38         cin >> n >> op_n;
39         Init(n);
40         for (int i = 0 ; i < op_n; ++ i) {
41             int x, y; cin >> x >> y;
42             Union(x, y);
43         }
44         int cnt = 0;
45         for (int i = 1; i <= n; ++ i) {
46             if (father[i] == i) {
47                 cnt ++;
48             }
49         }
50         cout << cnt << endl;
51     }
52     return 0;
53 }
 1 import java.util.*;
 2 import java.io.*;
 3 import java.math.*;
 4
 5 class DisjointSet{
 6     public static int MAXX = 1005;
 7     public int ans = 0;
 8     public int father[] = new int[MAXX];
 9     public int vis[] = new int[MAXX];
10
11     public DisjointSet(){
12         this.ans = 0;
13     }
14
15     public int GetAns(){
16         return ans;
17     }
18     public int GetFather(int x){
19         if(father[x] != 0){
20             return GetFather(father[x]);
21         }
22         else{
23             return x;
24         }
25     }
26
27     public void Union(int x, int y){
28         int fx = GetFather(x);
29         int fy = GetFather(y);
30         if(fx != fy){
31             father[fy] = fx;
32             ans++;
33         }
34     }
35 }
36
37 public class Main{
38     public static void main(String args[]){
39         Scanner in = new Scanner(System.in);
40         int l = in.nextInt();
41         int a, b, n, opn;
42         for(int i = 0; i < l; i++){
43             n = in.nextInt();
44             DisjointSet D = new DisjointSet();
45             opn = in.nextInt();
46             for(int j = 0; j < opn; j++){
47                 a = in.nextInt();
48                 b = in.nextInt();
49                 D.Union(a, b);
50             }
51             System.out.println(n - D.GetAns());
52         }
53     }
54 }

【HDU1231】How Many Tables(并查集基础题)

时间: 2024-10-12 18:05:01

【HDU1231】How Many Tables(并查集基础题)的相关文章

【HDU1232】畅通工程(并查集基础题)

裸敲并查集,很水一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 #include <string> 1

【HDU1856】More is better(并查集基础题)

裸并查集,但有二坑: 1.需要路径压缩,不写的话会TLE 2.根据题目大意,如果0组男孩合作的话,应该最大的子集元素数目为1.所以res初始化为1即可. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <numeric> 7 #include <

【HDU1325】Is It A Tree?(并查集基础题)

有以下坑点: 1.结束输入不一定-1,题目中的叙述只是说所有权值都为正值. 2.是否构成一棵树不能只判断是否只有一个根节点,没有环路,而且还需要判断每个节点的入度一定是1,不然就不是一棵树. (无环路也可用树的性质:结点数 = 边树 + 1 来取代) 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cctype> 5 #include <cmath&

【HDU2120】Ice_cream&#39;s world I(并查集基础题)

查环操作,裸题.一次AC. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #include <cmath> 6 #include <string> 7 #include <cstdio> 8 #include <algorithm> 9 #include <numeric>

How Many Tables——并查集模板题

题目链接 题意: n个人参加晚宴;完全不认识的两个人不能被分配在同一餐桌;认识具有传递性:A认识B B认识C,那么A和C也认识. 题解: 将认识两个人合并到同一集合:最后统计有多少个不同的集合即可; 代码: #include<iostream> #include<stdio.h> #include<math.h> using namespace std; typedef long long ll; const int maxn=5e5+5; int f[maxn]; i

Codeforces Round #254 (Div. 2) DZY Loves Chemistry【并查集基础】

一开始不知道题意是啥意思,迟放进去反应和后放进去反应有什么区别 对于第三组数据不是很懂,为啥312,132的组合是不行的 后来发现这是一道考察并查集的题目 QAQ 怒贴代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostream> 6 #include <algorithm> 7

G - Brain Network (easy)(并查集水题)

G - Brain Network (easy) Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u CodeForces 690C1 Description One particularly well-known fact about zombies is that they move and think terribly slowly. While we still don't know

poj 1182 食物链 并查集好题

挑战程序设计上有解答的并查集好题.把事件作为元素进行合并,举例:若输入1 2 3,意思就是把2,3归为同一类,至于归于哪一类并不需要去讨论,则把2属于A,3属于A这两件事件归为一类;2属于B,3属于B这两件事归为一类;2属于C,3属于C这两件事归为一类:若输入 2 2 3,由于A吃B,B吃C,C吃A,就把2属于A,3属于B这两件事情归为一类:以此类推.当检测到当前情况与之前正确的情况不符合,则错误的情况数加1. #include <iostream> #include <cstdio&g

UVALive 4487 Exclusive-OR 加权并查集神题

已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值 Xp1^Xp2,,,,X^pk 这个题目用加权并查集是这么处理的: 1. f[]照样是代表父节点,照样进行路径压缩,把每个 V[i]=V[i]^V[f[i]],即节点存储的值实际是它与它父亲的异或的值.为什么要这样呢,因为异或首先满足交换律,而且异或同一个数偶数次,即相当于本身,那么这个题目的其中一个要