蓝桥云课 并查集练习题

news/2024/11/18 18:36:45/

蓝桥幼儿园

题目描述

蓝桥幼儿园的学生是如此的天真无邪,以至于对他们来说,朋友的朋友就是自己的朋友。

小明是蓝桥幼儿园的老师,这天他决定为学生们举办一个交友活动,活动规则如下:

小明会用红绳连接两名学生,被连中的两个学生将成为朋友。

小明想让所有学生都互相成为朋友,但是蓝桥幼儿园的学生实在太多了,他无法用肉眼判断某两个学生是否为朋友。于是他起来了作为编程大师的你,请你帮忙写程序判断某两个学生是否为朋友(默认自己和自己也是朋友)。

输入描述

第 11 行包含两个正整数 N,M,其中 N 表示蓝桥幼儿园的学生数量,学生的编号分别为 1∼N。

之后的第 2∼M+1 行每行输入三个整数,op,x,y

如果 op=1op=1,表示小明用红绳连接了学生 xx 和学生 yy 。
如果 op=2op=2,请你回答小明学生 xx 和 学生 yy 是否为朋友。

1≤N,M≤2×10^5,1≤x,y≤N
输出描述

对于每个 op=2的输入,如果 x 和 y 是朋友,则输出一行 YES,否则输出一行 NO。
输入输出样例
示例 1

输入
5 5
2 1 2
1 1 3
2 1 3
1 2 3
2 1 2

输出
NO
YES
YES

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws IOException {String[] s = br.readLine().split(" ");int n=Integer.parseInt(s[0]);int m=Integer.parseInt(s[1]);UnionFind u=new UnionFind(n+1);while (m>0){s=br.readLine().split(" ");if (Integer.parseInt(s[0])==1){u.union(Integer.parseInt(s[1]),Integer.parseInt(s[2]));}else {if (u.isConnected(Integer.parseInt(s[1]),Integer.parseInt(s[2]))) System.out.println("YES");else System.out.println("NO");}m--;}}}class UnionFind{private int count;private int[] parent;public UnionFind(int count){this.count=count;parent=new int[count];for (int i=0;i<count;i++){parent[i]=i;}}public void union(int a,int b){int parentA=find(a);int parentB=find(b);if (parentA==parentB) return;parent[parentA]=parentB;count--;}public boolean isConnected(int a,int b){return find(a)==find(b);}public int find(int x){if (x==parent[x]) {return x;}else {parent[x]=find(parent[x]);return parent[x];}}public int getCount(){return this.count;}
}
import java.io.*;
import java.util.Scanner;public class Main {static int[] f;public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();f=new int[n+1];for (int i=1;i<=n;i++){f[i]=i;}for (int i=0;i<m;i++){int op=sc.nextInt();int x=sc.nextInt();int y=sc.nextInt();if (op==1){int fi=find(x);int fj=find(y);f[fi]=fj;}else {if (find(x)==find(y)){System.out.println("YES");}else {System.out.println("NO");}}}}public static int find(int x){if (x==f[x]) {return x;}else {f[x]=find(f[x]);return f[x];}}
}

蓝桥侦探

题目描述

小明是蓝桥王国的侦探。

这天,他接收到一个任务,任务的名字叫分辨是非,具体如下:

蓝桥皇宫的国宝被人偷了,犯罪嫌疑人锁定在 N 个大臣之中,他们的编号分别为 1∼N

在案发时这 N 个大臣要么在大厅1,要么在大厅2,但具体在哪个大厅他们也不记得了。

审讯完他们之后,小明把他们的提供的信息按顺序记了下来,一共 M 条,形式如下:

x y,表示大臣 xx 提供的信息,信息内容为:案发时他和大臣 yy 不在一个大厅。

小明喜欢按顺序读信息,他会根据信息内容尽可能对案发时大臣的位置进行编排。

他推理得出第一个与先前信息产生矛盾的信息提出者就是偷窃者,但推理的过程已经耗费了他全部的脑力,他筋疲力尽的睡了过去。作为他的侦探助手,请你帮助他找出偷窃者!
输入描述

第 1 行包含两个正整数 N,M,分别表示大臣的数量和口供的数量。

之后的第 2∼M+1行每行输入两个整数 x,y,表示口供的信息。

1≤N,M≤5×10^5,1≤x,y≤N
输出描述

输出仅一行,包含一个正整数,表示偷窃者的编号。
输入输出样例

输入
4 5
1 2
1 3
2 3
3 4
1 4

输出

2

import java.io.*;public class Main {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws IOException {String[] s = br.readLine().split(" ");int n=Integer.parseInt(s[0]);int m=Integer.parseInt(s[1]);UnionFind u=new UnionFind(2*n+1);while (m>0){s=br.readLine().split(" ");if (u.find(Integer.parseInt(s[0]))!=u.find(Integer.parseInt(s[1]))){u.union(Integer.parseInt(s[0]),Integer.parseInt(s[1])+n);u.union(Integer.parseInt(s[0])+n,Integer.parseInt(s[1]));}else {System.out.println(Integer.parseInt(s[0]));return;}m--;}}
}class UnionFind{private int count;private int[] parent;public UnionFind(int count){this.count=count;parent=new int[count];for (int i=0;i<count;i++){parent[i]=i;}}public void union(int a,int b){int parentA=find(a);int parentB=find(b);if (parentA==parentB) return;parent[parentA]=parentB;count--;}public boolean isConnected(int a,int b){return find(a)==find(b);}public int find(int x){if (x==parent[x]) {return x;}else {parent[x]=find(parent[x]);return parent[x];}}public int getCount(){return this.count;}
}

蓝桥部队

题目描述

小明是蓝桥部队的长官,他的班上有 N 名军人和 1 名军师。

这天,N 名军人在操场上站成一排,起初编号为 i 的军人站在第 i列。

作为长官,小明可以对军人和军师下达 M 条命令,命令有两种类型,格式如下:

1 x y,让军人 x 所在列的所有人作为一个整体移动到和军人 y 所在列的后面,使两列合并为一列。
2 x y,询问军师军人 x 和军人 y 是否站在同一列。若是,则军师要回应小明 x,y 之间有多少人,否则军师要回应 −1。

你就是小明的军师,请你回答小明的每个询问。
输入描述

输入第 1 行包含两个正整数 N,M,分别表示军人的数量和小明的命令条数。

第 2∼M+1 行每行表示一条命令。

2≤N≤10^5,1≤M≤3×10 5,1≤x,y≤N

输出描述

对于每个询问,输出一行表示答案。

输入输出样例
输入
3 5
2 1 2
1 2 1
2 1 2
1 1 3
2 2 3

输出
-1
0
1

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;public class Main {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));public static void main(String[] args) throws IOException {String[] s = br.readLine().split(" ");int n=Integer.parseInt(s[0]);int m=Integer.parseInt(s[1]);UF u=new UF(n+1);for (int i=0;i<m;i++){s=br.readLine().split(" ");int op=Integer.parseInt(s[0]);int x=Integer.parseInt(s[1]);int y=Integer.parseInt(s[2]);if (op==1){u.merge(y,x);}else {out.println(u.dist(x,y));}}out.flush();}
}class UF{//d表示到根节点的距离,siz表示这个连通块有多少个元素int[] f,d,siz;public UF(int n){f=new int[n];d=new int[n];siz=new int[n];for (int i=1;i<n;i++){f[i]=i;}Arrays.fill(siz,1);}int find(int x){if (x==f[x]) return f[x];int root=find(f[x]);d[x]+=d[f[x]];return f[x]=root;}boolean same(int x,int y){return find(x)==find(y);}boolean merge(int x,int y){x=find(x);y=find(y);if (x==y) return false;d[y]+=siz[x];siz[x]+=siz[y];f[y]=x;return true;}int size(int x){return siz[find(x)];}int dist(int x,int y){if (!same(x,y)) return -1;return Math.abs(d[x]-d[y])-1;}
}

http://www.ppmy.cn/news/12807.html

相关文章

Java寒假作业——问答题

Java寒假作业一、问答题&#xff08;26-50题&#xff09;26 解释进程和线程的区别进程和线程的区别主要包括&#xff1a;1&#xff09;线程的划分尺度小于进程&#xff0c;线程隶属于某个进程&#xff1b;2&#xff09;进程是程序的一种动态形式&#xff0c;是CPU、内存等资源占…

Vue缓存路由(keep-alive)以及新的生命周期

​ 一.概念 也就是说&#xff0c;kee-alive 是 Vue 内置的一个组件&#xff0c;可以使被包含的组件保留状态&#xff0c;或避免重新渲染 。也就是所谓的组件缓存 keep-alive 是 Vue 的内置组件&#xff0c;当它包裹动态组件时&#xff0c;会缓存不活动的组件实例&#xff0c;而…

C语言—基于realloc函数实现的通讯录

专栏&#xff1a;C语言 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些C语言的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 动态通讯录前言一、ContactInit初始化二、Contact…

JavaScript高级 ES6类

ES6类1. 认识class定义类2. 类和构造函数的异同3. 类的构造函数4. 类的实例方法5. 类的访问器方法6. 类的静态方法7. ES6类的继承8. super关键字9. 继承内置类10. 类的混入11. ES5 ES6 class 代码转换12. ES5 ES6 extends 代码转换13. JavaScript中的多态1. 认识class定义类 我…

Java中的LinkedList

文章目录前言一、LinkedList的使用1.1 什么是LinkedList1.2 LinkedList的使用1.2.1 LinkedList的构造1.2.2 LinkedList的其他常用方法介绍1.2.3 LinkedList的遍历二、LinkedList的模拟实现三、ArrayList和LinkedList的区别总结前言 上一节中我们讲解了Java中的链表&#xff0c…

Vue生命周期,总也学不会,所以我详细整理了一下

今天&#xff0c;我和大家一起来对vue生命周期做一个整理和思考&#xff0c;希望有缘人看到我的年度整理和思考&#xff0c;如果觉得靠谱呢&#xff0c;就交个朋友&#xff0c;如果觉得我整理的不足&#xff0c;就请指出&#xff0c;让我们一起进步&#xff0c;让我们2023年能共…

【5】KubeSphere部署应用 | MySQL

目录 1、部署的架构 2、KubeSphere几个主要的模块 3、部署MySQL 【1】先创建MySQL的配置文件 【2】创建存储卷 【3】部署有状态服务 【4】查看创建的服务 【5】创建一个服务可以在集群外可以访问 1、部署的架构 2、KubeSphere几个主要的模块 KubeSphere的工作负载相当于k8s里…

无线倾角报警仪测试键、设置键、调整键的作用

按键&#xff1a;测试键、设置键、调整键测试键&#xff1a;a. 在除了进行设置之外的任何时候&#xff0c;长按此键可以模仿报警时的状态&#xff08;灯闪、机内蜂鸣音、继电器吸合&#xff09;&#xff0c;松开按键则恢复到初始状态。可以作为用户在安装报警仪之后的功能测试&…