并查集 Myth丶恋晨 2022-06-08 09:24 318阅读 0赞 > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签,标签数字范围1到n。为了统计分组情况,学校要求有分组意愿的同学提交一个数字,表示其会和以该数字为标签的同学分到一组。 > 现在告诉你每位同学的选择,你能统计出一共有多少个小组么? > 注意如果1和2一组,2和3一组,那么1,2,3属于一组。默认自己一定和自己在一组。 > 输入 > 输入包括两行,第一行是同学的个数n > 第二行一共有n个数,分别代表第i个同学愿意和哪个同学组队 > 输出 > 输出包括一个整数,表示组的队数 这是一道经典的并查集算法,以下为代码 import java.util.Scanner; public class Main { static int[] pre ; static int[] t; static int count; public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] array = new int[n]; pre = new int[n+1];//记录前导点 for (int i = 1; i <= n; i++) { //初始化前导点 pre[i] = i; } for (int i = 0; i < n; i++) { array[i] = in.nextInt(); union(i+1, array[i]); } t = new int[n+1];//记录根节点 for (int i = 1; i <= n; i++) { t[pre[i]] = 1; } for (int i = 0; i < n; i++) { if(t[i] == 1) count++; } System.out.println(count); } /** * 查找根节点 * @param x * @return */ private static int find(int x){ int r = x; while(pre[r]!=r){ r = pre[r]; } int i = x,j; while(i!=r){ //更新前驱节点为根节点 j = pre[i]; pre[i] = r; i = j; } return r; } private static void union(int x, int y){ int fx = find(x); int fy = find(y); if(fx!=fy)//如果根节点不同则合并 pre[fx] = fy; } } 并查集通常还会用来判断是否有环,例如下题 > 题目:在一个王国里,建立很多瞭望塔,瞭望塔之间连接有围墙。给出瞭望塔个数n,各个塔之间的围墙数m。接着给出m组A B; > 表示A B之间有围墙连接,问这些哨塔,围墙把土地分割成了几个部分。 土地被分割成几部分其实就是指有多少个环,对于并查集查找函数,如果两个节点的父节点不相同,则合并这两个节点所在集合,否则说明这两个节点之间原本就存在通路,再加上这条边就组成了环。 代码如下: import java.util.Scanner; public class Main { static int[] pre ; static int count; public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int[] array = new int[n]; pre = new int[n+1];//记录前导点 for (int i = 1; i <= n; i++) { //初始化前导点 pre[i] = i; } for (int i = 0; i < m; i++) { int a = in.nextInt(); int b = in.nextInt(); union(a, b); } System.out.println(count); } /** * 查找根节点 * @param x * @return */ private static int find(int x){ int r = x; while(pre[r]!=r){ r = pre[r]; } return r; } private static void union(int x, int y){ int fx = find(x); int fy = find(y); if(fx!=fy)//如果根节点不同则合并 pre[fx] = fy; else count++; } }
相关 并查集 Ⅱ \[poj 1611\] ([http://poj.org/problem?id=1611][http_poj.org_problem_id_1611]) 题目描述: T 古城微笑少年丶/ 2022年08月03日 14:35/ 0 赞/ 291 阅读
相关 并查集 并查集JAVA版框架 并查集是一种用来管理元素分组情况的数据结构。 并查集可以高效地进行如下操作: \--查询元素a和元素b是否属于同一组 落日映苍穹つ/ 2022年06月16日 12:44/ 0 赞/ 326 阅读
相关 并查集 这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的 港控/mmm°/ 2022年06月13日 14:13/ 0 赞/ 310 阅读
相关 并查集 > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签 Myth丶恋晨/ 2022年06月08日 09:24/ 0 赞/ 319 阅读
相关 并查集 森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是 Love The Way You Lie/ 2022年04月17日 02:27/ 0 赞/ 379 阅读
相关 并查集 来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性 我就是我/ 2022年03月29日 10:58/ 0 赞/ 383 阅读
相关 并查集 > 并查集是一种树形的数据结构,用于集合的合并。 与C++STL相比的优势: 1. 可以同时维护多个集合 2. 快速的合并两个集合 \\现实: 用数组实现。fat 左手的ㄟ右手/ 2022年02月05日 00:23/ 0 赞/ 270 阅读
相关 并查集 例题: ![输入样例][20190805122001677.png] 输入样例,第一行为一个整数n,代表有n台电脑,编号1-n;接下来进行一系列操作,当输入‘c’时,判 Dear 丶/ 2021年11月11日 08:04/ 0 赞/ 394 阅读
相关 并查集 一、算法解释 用于解决一些有N个元素的集合应用问题。 1、将每个元素初始化为自身单独成为一个集合。用p\[i\]的值表示该元素所在集合。 ![这里写图片描述][S 桃扇骨/ 2021年09月14日 02:56/ 0 赞/ 486 阅读
相关 并查集 并查集的作用就是快速判断两个元素是否在同一个集合中,快速将两个集合合并 基本模板 include <iostream> include <a 比眉伴天荒/ 2021年06月22日 15:37/ 0 赞/ 585 阅读
还没有评论,来说两句吧...