7-35 部落 (10 分)

简介: 7-35 部落 (10 分)

7-35 部落 (10 分)


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


输入格式:


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


K P[1] P[2] ⋯ P[K]


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


之后一行给出一个非负整数Q(≤104),是查询次数。随后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


结尾无空行


输出样例:


1. 10 2
2. Y
3. N


结尾无空行


#include<iostream>
using namespace std;
const int N = 1010;
int n, k, a, b, p[N], maxn, cnt, m;
int find(int x) {
    if(x != p[x]) p[x] = find(p[x]);
    return p[x];
}
void add(int x, int y) {
    x = find(x), y = find(y);
    p[x] = find(y);
}
void init() {
    for (int i = 1; i <= N; i++) {
        p[i] = i;
    }
}
int main() {
    cin >> n;
    init();
    for (int i = 0; i < n; i++) {
        cin >> k;
        for (int j = 0; j < k; j++) {
            if(j == 0) {
                cin >> a;
                maxn = max(a, maxn);
            }
            else {
                cin >> b;
                maxn = max(b, maxn);
                add(a, b);
            }
        }
    }
    for (int i = 1; i <= maxn; i++) {
        if (p[i] == i) cnt++;
    }
    cout << maxn << ' ' << cnt << endl;
    cin >> m;
    for (int i = 0; i < m; i++) {
        cin >> a >> b;
        if(find(a) != find(b)) cout << "N\n";
        else cout << "Y\n";
    }
    return 0;
}


目录
相关文章
|
1月前
7-35 情人节 (15 分)
7-35 情人节 (15 分)
23 0
【八月】每日一题 - 1282. 用户分组
【八月】每日一题 - 1282. 用户分组
57 0
部落是一个魔法部落,部落中一共有n+1个人,小Biu是魔法部落中最菜的,所以他的魔力值为1,魔法部落中n个人的魔法值都不相同,第一个人的魔法值是小Biu的3倍,第二个人的魔法值是第一个人的3倍,以此类推。 现在小Biu想知道整个部落的魔法值和是多少?由于答案比较大,请把答案对1e9+7取模之后输出
部落是一个魔法部落,部落中一共有n+1个人,小Biu是魔法部落中最菜的,所以他的魔力值为1,魔法部落中n个人的魔法值都不相同,第一个人的魔法值是小Biu的3倍,第二个人的魔法值是第一个人的3倍,以此类推。 现在小Biu想知道整个部落的魔法值和是多少?由于答案比较大,请把答案对1e9+7取模之后输出
103 0
L2-024 部落 (25 分)(并查集)
L2-024 部落 (25 分)(并查集)
87 0
L1-073 人与神 (5 分)
L1-073 人与神 (5 分)
77 0
L1-035 情人节 (15 分)
L1-035 情人节 (15 分)
114 0
L1-035 情人节 (15 分)
|
程序员
L1-038 新世界 (5 分)
L1-038 新世界 (5 分)
69 0
093.波瓦松的分酒趣题
093.波瓦松的分酒趣题
67 0
L1-3 讲武德 (10 分)
马保国血量为x,防御力为y 你一共可以攻击n次(可以小于n次),每次可以使出左正蹬、右鞭腿和左刺拳,攻击力分别是p1,p2,p3 如果你的攻击力总和小于或等于马保国的防御力y,就会被他全部防出去,不会造成伤害 如果你的攻击力总和大于马保国的血量加防御力x+y,就会把他打骨折,你就没有讲武德 请问你总共有多少种讲武德并且可以伤害到他的攻击组合方式?
85 0
|
C语言
浙大版《C语言程序设计(第3版)》题目集 - 习题9-6 按等级统计学生成绩(20 分)
浙大版《C语言程序设计(第3版)》题目集 - 习题9-6 按等级统计学生成绩(20 分)
114 0