首页 > 其他分享 >浙大版《数据结构学习与实验指导(第2版)》题目集-基础实验4-2.8 部落

浙大版《数据结构学习与实验指导(第2版)》题目集-基础实验4-2.8 部落

时间:2024-11-28 13:29:10浏览次数:9  
标签:部落 int 浙大 fa 2.8 实验 编号 小圈子 find

题目:

基础实验4-2.8 部落

分数 25

作者 陈越

单位 浙江大学

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

输入格式:

输入在第一行给出一个正整数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

输出样例:

10 2
Y
N

代码长度限制    16 KB    时间限制     150 ms

内存限制   64 MB           栈限制 8192 KB

思路:并查集 set

1.用set存储每个人的编号,来统计总人数

2.构造一个fa数组来存储每个人的父节点,初始将每个人自己设为自己的父节点

for(int i=0;i<10010;i++)fa[i]=i;

3.在每个部落中,将第一个人设为该部落所有人的父节点

4.在同一个部落中,每个人和部落第一个人(父节点)进行合并

for(int i=1;i<k;i++){
            int b;
            cin>>b;
            num.insert(b);
            unto(a,b);
        }

然后部落就构造好了,可以最后的输出!!!

 

 

代码:

#include<bits/stdc++.h>
using namespace std;

int fa[10010];
int find(int x){
    if(x!=fa[x])return fa[x]=find(fa[x]);
    return x;
}
void unto(int x,int y){
    int a=find(x);
    int b=find(y);
    fa[a]=b;
}

int main(){
    int n;
    cin>>n;
    for(int i=0;i<10010;i++)fa[i]=i;
    set<int>num;
    for(int i=0;i<n;i++){
        int k;
        cin>>k;
        int a;
        if(k>0){
        cin>>a;
        num.insert(a);
        }
        for(int i=1;i<k;i++){
            int b;
            cin>>b;
            num.insert(b);
            unto(a,b);
        }
    }
    int act=0;
    for(int i=1;i<=num.size();i++){
        if(fa[i]==i)act++;
    }
    cout<<num.size()<<" "<<act<<endl;
    int m;
    cin>>m;
    while(m--){
        int x,y;
        cin>>x>>y;
        if(find(x)!=find(y))cout<<"N"<<endl;
        else cout<<"Y"<<endl;
    }
}

标签:部落,int,浙大,fa,2.8,实验,编号,小圈子,find
From: https://blog.csdn.net/kg1ling/article/details/144108635

相关文章

  • #20222309 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容(1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式该域名对应IP地址IP地址注册人及联系方式IP地址所在国家、城市和具体地理位置PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线工具进行搜集信......
  • Reachy 2,专为AI与机器人实验室打造的卓越开源双臂移动操作平台!
    近期,花粉机器人(POLLENROBOTICS)隆重推出Reachy2仿生机器人——下一代开源操作平台,为AI与机器人实验室带来理想的双臂移动操作科研平台!Reachy2的仿生性:》拥有两个基于Maxon无刷电机的仿生7自由度机械臂和一个独特的3自由度颈部关节。》颈部和手腕采用其patented的Orbita3D......
  • 软件设计:实验2:简单工厂模式
    实验2:简单工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解简单工厂模式的动机,掌握该模式的结构;2、能够利用简单工厂模式解决实际问题。 [实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参......
  • 软件设计:实验1:UML与面向对象程序设计原则
    实验1:UML与面向对象程序设计原则本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、掌握面向对象程序设计中类与类之间的关系以及对应的UML类图;2、理解面向对象程序设计原则。 [实验任务一]:UML复习阅读教材第一章复习UML,回答下述问题:面向对象程序设计中类与类的关......
  • 软件设计:实验3:工厂方法模式
    实验3:工厂方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解工厂方法模式的动机,掌握该模式的结构;2、能够利用工厂方法模式解决实际问题。 [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryption......
  • 软件设计:实验4:抽象工厂模式
    实验4:抽象工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解抽象工厂模式的动机,掌握该模式的结构;2、能够利用抽象工厂模式解决实际问题。 [实验任务一]:人与肤色使用抽象工厂模式,完成下述产品等级结构: 实验要求:1.画出对应的类图;2.提交源代码;3.注......
  • 软件设计:实验7:单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1.画出对应的类图;2.提交源......
  • 软件设计:实验6:原型模式
    实验6:原型模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解原型模式的动机,掌握该模式的结构;2、能够利用原型模式解决实际问题。 [实验任务一]:向量的原型用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比......
  • 软件设计:实验5:建造者模式
    实验5:建造者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解建造者模式的动机,掌握该模式的结构;2、能够利用建造者模式解决实际问题。 [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起......
  • 软件设计:实验9:桥接模式
    实验9:桥接模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解桥接模式的动机,掌握该模式的结构;2、能够利用桥接模式解决实际问题。 [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。实验要求......