并查集(Pascal版)

 1 const maxn=100;
 2 var
 3         i,j,k,l,m,n:longint;
 4         c:array[0..maxn] of longint;
 5 function getfat(x:longint):longint;     \\非路径压缩
 6         begin
 7                 if c[x]<>x then exit(getfat(c[x])) else exit(x);
 8         end;
 9 {
10 function getfat(x:longint):longint;     \\路径压缩
11         begin
12                 if c[x]<>x then c[x]:=getfat(x);
13                 exit(c[x]);
14         end;
15         }
16 begin
17         readln(n,m);
18         for i:=1 to n do c[i]:=i;
19         for i:=1 to m do
20                 begin
21                         readln(l,j,k);
22                         case l of
23                                 1:c[getfat(j)]:=getfat(k);     \\merge
24                                 2:writeln(getfat(j)=getfat(k));     \\query
25                         end;
26                 end;
27 end.
时间: 2024-08-08 00:03:01

并查集(Pascal版)的相关文章

洛谷 P2661 信息传递 Label:并查集?

题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象).当有人从别人口中得知自己的生日时,游戏结束.请问该游戏一共可以进行几轮? 输入输出格式 输入格式: 输入共2行. 第1行包含1个正整数n表示

Kruskal算法的C语言实现(并查集版)

[问题] Kruskal算法求加权连通图的最小生成树的算法.kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中.注意到所选取的边若产生环路则不可能形成一棵生成树.kruskal算法分e 步,其中e 是网络中边的数目.按耗费递增的顺序来考虑这e 条边,每次考虑一条边.当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入. [代码] #include <stdio.h> #include

hdu 1829 并查集(食物链的弱化版)

http://acm.hdu.edu.cn/showproblem.php?pid=1829 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of

算法(第四版)之并查集(union-find算法)

开个新坑, 准备学习算法(第四版), 并把上面学到的东西写成博客, 毕竟以前也学过一点算法, 但效果甚微 并查集, 在这本书的第一章1.5中叫做union-find算法, 但在其他地方这个叫做并查集,就是说一系列点的连通问题,比如, 我们有十个点, 分别记作0~9: 加入我们要把2和4连接起来怎么表示呢? 首先我们会想到,给所有的点标上一个号, 来代表他们的连通关系, 我们初始化这个数就是他们id本身: 如果我们要连接2和4, 就使得4的id为2: 之后要连接间隔点任意两个点, 就把它们和它们相

第48套题【tarjan】【图&amp;树的连通性】【并查集】

Problem 1 图的连通性??题目背景??琼和雪不知从什么时候就开始形影不离得呆在一起,无话不说了那天她们在谈论图论??题意描述??“有一个无向图,每次断掉一条边,并询问两个点时候联通,你会维护么?” 琼很认真地问.“为什么要知道这个呢?”“我们总要知道自己是否身陷囹囵……你必须立刻告诉我答案哦”??输入格式??测试数据的第一行是三个正整数n.m.t, 表示无向图有n 个点,m 条边和t 个操作接下来m 行,每行两个正整数x.y,表示x 和y 之间有一条边(允许存在重边)接下来t 行,每行三

并查集 (Union-Find Sets)及其应用

定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. 主要操作 初始化 把每个点所在集合初始化为其自身. 通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N). 查找 查找元素所在的集合,即根节点. 合并 将两个元素所在的集合合并为一个集合. 通常来说,合并之前,应先判断两个元素是否属于

关于一般的并查集求根操作的一组对照研究

说道并查集,大家一定对于以多叉树状结构为基础的并查集并不陌生最常见的两种写法如下 1 private function getfat(x:longint):longint; 2 begin 3 while x<>c[x] do x:=c[x]; 4 exit(x); 5 end; 1 private function getfat(x:longint):longint; 2 begin 3 if x<>c[x] then exit(getfat(c[x])) else exit(x

可持久化并查集加强版 BZOJ 3674

http://www.lydsy.com/JudgeOnline/problem.php?id=3674 3674: 可持久化并查集加强版 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 3225  Solved: 1192[Submit][Status][Discuss] Description Description:自从zkysb出了可持久化并查集后--hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可

UVA 3027 Corporative Network 带权并查集、

题意:一个企业要去收购一些公司把,使的每个企业之间互联,刚开始每个公司互相独立 给出n个公司,两种操作 E I:询问I到I它连接点最后一个公司的距离 I I J:将I公司指向J公司,也就是J公司是I公司的上级,距离为abs(I-J)%1000(貌似G++不支持abs,PE了两发) 思路:转化一下题意就行了,首先刚开始的时候每个公司都是独立的,I操作就是并查集中合并操作,将I这课树并到J这个树上, E操作要求的东西就是 I到I的根节点的距离,先看一个没有路径压缩直接暴力的方法把.(本以为不会过的,