并查集 Myth丶恋晨 2022-06-08 09:24 285阅读 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 赞/ 252 阅读
相关 并查集 并查集JAVA版框架 并查集是一种用来管理元素分组情况的数据结构。 并查集可以高效地进行如下操作: \--查询元素a和元素b是否属于同一组 落日映苍穹つ/ 2022年06月16日 12:44/ 0 赞/ 287 阅读
相关 并查集 这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的 港控/mmm°/ 2022年06月13日 14:13/ 0 赞/ 276 阅读
相关 并查集 > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签 Myth丶恋晨/ 2022年06月08日 09:24/ 0 赞/ 286 阅读
相关 并查集 森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是 Love The Way You Lie/ 2022年04月17日 02:27/ 0 赞/ 344 阅读
相关 并查集 来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性 我就是我/ 2022年03月29日 10:58/ 0 赞/ 338 阅读
相关 并查集 > 并查集是一种树形的数据结构,用于集合的合并。 与C++STL相比的优势: 1. 可以同时维护多个集合 2. 快速的合并两个集合 \\现实: 用数组实现。fat 左手的ㄟ右手/ 2022年02月05日 00:23/ 0 赞/ 239 阅读
相关 并查集 并查集 并查集是对树的一种操作,旨在找到某个节点的公共祖先(最老公共祖先)。我们先讲一下并。 并 并就是讲两个节点合并到一个集合里面(这个集合必须是树),每个节点 谁践踏了优雅/ 2021年12月15日 11:33/ 0 赞/ 372 阅读
相关 并查集 一、算法解释 用于解决一些有N个元素的集合应用问题。 1、将每个元素初始化为自身单独成为一个集合。用p\[i\]的值表示该元素所在集合。 ![这里写图片描述][S 桃扇骨/ 2021年09月14日 02:56/ 0 赞/ 446 阅读
相关 并查集 并查集的作用就是快速判断两个元素是否在同一个集合中,快速将两个集合合并 基本模板 include <iostream> include <a 比眉伴天荒/ 2021年06月22日 15:37/ 0 赞/ 538 阅读
还没有评论,来说两句吧...