在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。

输入格式:

输入在第一行给出一个正整数N(≤),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:

K [ [ ⋯ [

其中K是小圈子里的人数,[(,)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过1。

之后一行给出一个非负整数Q(≤),是查询次数。随后Q行,每行给出一对被查询的人的编号。

输出格式:

首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出Y,否则输出N

输入样例:

4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7

输出样例:

10 2
Y
N
#include <bits/stdc++.h>
using namespace std;
int n,q;
int par[],ran[];
int arr[];
int find(int a)
{
if(a==par[a])
return a;
else
return par[a]=find(par[a]);
}
void unite(int a,int b)
{
a = find(a);
b = find(b);
if(a==b)
return ;
if(ran[a]>ran[b])
par[b] = a;
else
{
par[a] = b;
if(ran[a]==ran[b])
ran[b]++;
}
}
bool same(int a,int b)
{
return find(a) == find(b);
}
int main()
{
cin>>n;
for(int i=;i<;i++)
{
par[i] = i;
ran[i] = ;
}
int k;
set<int> s;
while(n--)
{
cin>>k;
for(int i=;i<k;i++)
{
cin>>arr[i];
s.insert(arr[i]);
}
for(int i=;i<k;i++)
unite(arr[i-],arr[i]);
} int sum = s.size();
set<int> ss;
for(int i=;i<=sum;i++)
{
int t = find(i);
ss.insert(t);
}
cout<<sum<<" "<<ss.size()<<endl;
cin>>q;
int x,y;
while(q--)
{
cin>>x>>y;
if(same(x,y))
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
return ;
}
 

L2-024 部落 (25 分)并查集的更多相关文章

  1. L2-007 家庭房产 (25分) 并查集

    题目链接 题解:并查集把一个家的并在一起,特殊的一点是编号大的并到小的去.这个题有个坑编号可能为0000,会错数据3和5. 1 #include<bits/stdc++.h> 2 usin ...

  2. L2-013 红色警报 (25分) 并查集复杂度

    代码: 1 /* 2 这道题也是简单并查集,并查集复杂度: 3 空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)), 4 这里Alpha是 ...

  3. PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  4. BZOJ 1821 部落划分(二分+并查集)

    答案是具有单调性的. 因为最近的两个部落的距离为mid,所以要是有两个野人的距离<mid,则他们一定是一个部落的. 用并查集维护各联通块,如果最后的联通块个数>=k,那么mid还可以再小点 ...

  5. PAT-1107 Social Clusters (30 分) 并查集模板

    1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...

  6. PAT A 1118. Birds in Forest (25)【并查集】

    并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...

  7. PAT甲题题解-1021. Deepest Root (25)-dfs+并查集

    dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...

  8. PAT甲题题解-1114. Family Property (25)-(并查集模板题)

    题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...

  9. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  10. PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性

    题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...

随机推荐

  1. 在JS中将JSON的字符串解析成JSON数据格式

    使用eval函数来解析 <script> var data="{root: [{name:'1',value:'0'},{name:'6101',value:'北京市'},{na ...

  2. 九度OJ 1098:字母统计 (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3720 解决:1809 题目描述: 输入一行字符串,计算其中A-Z大写字母出现的次数 输入: 案例可能有多组,每个案例输入为一行字符串. 输 ...

  3. 按照eslint 规范写代码 [eslint] 'flag' is assigned to itself. (no-self-assign)

    按照eslint 规范写代码 [eslint] 'flag' is assigned to itself. (no-self-assign)

  4. Maximum Memory and CPU Limitations for Linux Server

    grep NR_CPUS /boot/config-`uname -r` [webdev@test apache-flume-1.8.0-bin]$ grep NR_CPUS /boot/config ...

  5. Redis(三)位图

    1.目录 什么是位图 位图的作用 基本使用 2.什么是位图 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB ...

  6. 挂断电话demo

    <!-- 结束通话和打电话的权限 --> <uses-permission android:name="android.permission.CALL_PHONE" ...

  7. UIVisualEffectView

    UIBlurEffect 只支持到iOS 8.0+.系统给予的一个自动生成滤镜的方法 UIVisualEffectView *effectView = [[UIVisualEffectView all ...

  8. c语言之秒数算法

    // 水仙花树:是指一个3位数字,立方和 等于该数本身 // 秒数算法:随便输入一个大于0的数,求出对应的多少小时多少分钟多少秒 #include <stdio.h> / int main ...

  9. cookie(点心的意思)服务器给客户端的点心

    他是用户访问web服务器时,服务器在用户硬盘上存放的信息,好像是服务器给客户端的“点心”.比如:是否记录用户名密码.其中,A服务器不允许访问B服务器存在客户端的cookie 一个cookie包含一对k ...

  10. 简单封装微信小程序

    一.不同环境配置封装 新建config文件夹,根据自己有不同环境设置不同的js文件 具体js文件内容: exports.config = { requestHost: 'https://******. ...