并查集题目

POJ 1611 The Suspects

题意是n个人,m组数,每组数的第一个数k表示这组数有k个数,求所有与0直接或间接有关系的数。

建立它们之间的关系后,只要查询下最终的根是0的个数就行,当然两个数中只能最小的数当根。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int maxn = 3e4+10;
 5 int fa[maxn], rank[maxn];
 6 int n, m;
 7 int find(int x){
 8     if(x == fa[x])return x;
 9     else return fa[x] = find(fa[x]);
10 }
11 void uni(int x, int y){
12     x = find(x);
13     y = find(y);
14     if(x < y){
15         fa[y] = x;
16     }else{
17         fa[x] = y;
18     }
19 }
20 int main(){
21     while(~scanf("%d",&n)&&n){
22         scanf("%d",&m);
23         int ans = 0;
24         for(int i = 1; i < n; i ++){
25             fa[i] = i;
26             rank[i] = 0;
27         }
28         for(int i = 1; i <= m; i ++){
29             int a, b, c;
30             scanf("%d%d",&a,&b);
31             for(int i = 1; i < a; i ++){
32                 scanf("%d",&c);
33                 uni(b, c);
34             }
35         }
36         for(int i = 0; i < n; i ++){
37             if(find(i) == 0) ans ++;
38         }
39         printf("%d\n",ans);
40     }
41     return 0;
42 }

HDU 1314 How Many Tables

题意是n个人中,给定一些人之间的关系,直接或间接有关系的一组,求最终有多少组。

并查集,求最终的根是本身的有多少。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int maxn = 1e3+10;
 5 int fa[maxn];
 6 int find(int x){
 7     if(fa[x] == x)return x;
 8     else return fa[x] = find(fa[x]);
 9 }
10 void uni(int x, int y){
11     x = find(x);
12     y = find(y);
13     if(x < y){
14         fa[y] = x;
15     }else{
16         fa[x] = y;
17     }
18 }
19 int main(){
20     int t, n, m;
21     scanf("%d",&t);
22     while(t--){
23         int ans = 0;
24         scanf("%d%d",&n,&m);
25         for(int i = 1; i <= n; i ++) fa[i] = i;
26         for(int i  = 0; i < m; i ++){
27             int a, b;
28             scanf("%d%d",&a,&b);
29             uni(a, b);
30         }
31         for(int i = 1; i <= n; i ++){
32             if(fa[i] == i) ans ++;
33         }
34         printf("%d\n",ans);
35     }
36     return 0;
37 }
时间: 2024-10-08 17:57:09

并查集题目的相关文章

【并查集题目总结】

[并查集题目总结] 问题一:并查集森林的连通分支数(经典,pre[ i ] == i ?) http://acm.hdu.edu.cn/showproblem.php?pid=1232 问题二:并查集森林所有连通分支最大元素个数(维持一个cnt[ ]数组) http://acm.hdu.edu.cn/showproblem.php?pid=1856 问题三:构造并查集森林过程中计数不能成环的边数(成环 等价于 根节点相同) http://acm.hust.edu.cn/vjudge/proble

并查集题目从入门到入土

2017-09-01 并查集一个神奇的算法 今天我们的s同学想学习一下并查集,就去找了几个水题刷一下... 入门题_1:P2839 畅通工程 畅通工程 就是求联通块的数量,-1就是答案. #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int read(){ int f=1,an=0; char ch=getchar(); while(!('0'<=ch&

poj 1611 :The Suspects经典的并查集题目

Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others.   In the Not-Spr

并查集题目整理

并查集 之前写最小生成树的时候对这一部分的知识也并没有十分详细的整理 近天做了一些用到并查集的题目,来整理一下 知识回顾 首先,先来回顾一下有关并查集的内容 <1> 定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. <2>初始化 把每个点所在集合初始化为其自身. 通常来说,这个步骤在每次使用该数据结构时只需要执行

684. 冗余连接——经典并查集题目

684. 冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边. 结果图是一个以边组成的二维数组.每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边. 返回一条可以删去的边,使得结果图是一个有着N个节点的树.如果有多个答案,则返回二维数组中最后出现的边.答案边 [u, v] 应满足相同的

HDU3234&amp;&amp;UVA12232&amp;&amp;LA4487:Exclusive-OR(经典带权并查集)

Problem Description You are not given n non-negative integers X0, X1, ..., Xn-1 less than 220 , but they do exist, and their values never change. I'll gradually provide you some facts about them, and ask you some questions. There are two kinds of fac

HDU 并查集 - 3172 Virtual Friends

并查集题目,并的意思就是将两个不同类别的集合合并到一起,类似于两棵树合并:查的意思就是找到这个点所属集合的根节点.基本上并查集题目都是在大体架构上面加一些东西即可.并查集代码模板在这里点击打开链接. 这一题为了找到输入的两个人组成的社交网络人数,也就是统计这两个人与前面的人组成的集合中有多少元素.我们加一个辅助数组sum,当两个集合并时,我们将父节点对应下标的sum值加上子节点的sum值,表达这个集合有多少元素. #include<stdio.h> #include<iostream&g

hdu 1829 A Bug&#39;s Life (基础并查集)

题目: 链接:点击打开链接 题意: 给定虫子的交配关系,确定实验是否支持教授的假设即没有同性恋或者不符合假设. 思路: 是一道基础的并查集题目.存在两个集合异性和同性,给出多组关系,看这两个集合有木有联系,即是否有同性恋. 定义一个数组sex[],sex[i]表示与编号i的性别相反的虫子编号.然后将和i虫子有联系的合并为同一个集合(认为是同性的).如果findset(u) == findset(v),出现了反常行为. 代码: #include <iostream> #include <c

hdu5222 拓扑+并查集

http://acm.hdu.edu.cn/showproblem.php?pid=5222 Problem Description Miceren likes exploration and he found a huge labyrinth underground! This labyrinth has N caves and some tunnels connecting some pairs of caves. There are two types of tunnel, one typ