算法模板——并查集

实现功能——操作1:将两个数字合并到一个集合内;操作2:判断两个数字是否在一起

第6行是亮点,这个优化能快出不少,真的

 1 var
 2    i,j,k,l,m,n:longint;
 3    c:array[0..100000] of longint;
 4 function getfat(x:longint):longint;inline;
 5          begin
 6               if c[x]<>x then c[x]:=getfat(c[x]);   //亮点在这里么么哒
 7               exit(c[x]);
 8          end;
 9 begin
10      readln(n);
11      for i:=1 to n do c[i]:=i;
12      while true do
13            begin
14                 read(i);if (i<1) or (i>2) then halt;
15                 readln(j,k);
16                 case i of
17                      1:c[getfat(j)]:=getfat(k);    //合并
18                      2:if getfat(j)=getfat(k) then writeln(‘Together!‘) else writeln(‘Not together!‘); //判断是否已合并
19                 end;
20            end;
21 end.
22              
时间: 2024-10-10 09:15:50

算法模板——并查集的相关文章

算法模板——并查集 2(支持快速即时查询本连通块内容,纯原创!)

实现功能:输入N,现在有N个数:接下来输入任意行,如果是"1 x y"则表示把x和y所在的块合并:如果是"2 x"则表示输出x所在的块的全部内容 原理:其实主要是自己创造了一个可并链line,he表示链头,ta表示链尾,然后对于不同块之间的合并就是直接把两条链对接,也就是一个的尾巴接到另一个的头上,构成新链(由于是链的直接叠加,所以可以做到严格的O(1),并且输出时输出多少复杂度就是多少,完全不存在额外复杂度).然后同时用原本的普通数组并查集进行维护和追踪(理论值为

模板 并查集

[模板]并查集 1 int find(int x) 2 { 3 int r = x; 4 while(father[r]!=r) 5 r = father[r]; 6 return r; 7 } 8 /* 9 int find(int x) 10 { 11 if(father[x] == x) 12 return x; 13 else 14 return father[x] =find(father[x]); 15 } 16 */ 17 18 void join(int x,int j) 19

HDU 1213 How Many Tables(模板——并查集)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the fri

【数据结构与算法】并查集基础

1.介绍 并查集是一种树型数据结构,用于处理一些不相交集合的合并问题. 并查集主要操作有: (1)合并两个不相交集合: (2)判断两个元素是否属于同一个集合: (3)路径压缩: 2.常用操作 用father[i]表示元素i的父亲结点,例如: 用某个元素所在树的根节点表示该元素所在集合: 判断两个元素是否属于同一个集合的时候,只需要判断他们所在树的根节点是否一样即可: 也就是说,当我们合并两个集合的时候,只需要在两个根节点之间连边即可. 获取根节点代码: 1 int findFather(int

算法:并查集

并查集是一种用途广泛的数据结构,能够快速地处理集合的合并和查询问题,并且实现起来非常方便,在很多场合中都有着非常巧妙的应用,.本文首先介绍并查集的定义.原理及具体实现,然后以其在最小生成树算法中的一个经典应用为例讲解其具体使用方法. 一 并查集原理及实现 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题. 并查集在使用中通常以森林来表示,每个集合组织为一棵树,并且以树根节点为代表元素.实际中以一个数组father[x]即可实现,表示节点x的父亲节点.另外用一个变量n表示节点的个

(算法)并查集及其应用

题目: 某国家有N个小岛组成,经过多年的基础设施累积,若该岛屿之间建立若干桥梁,先重新完善该国的行政区划,规定只要有桥梁连接的岛屿则归属于同一个城市(可以通过其他岛屿中转),问该国可以划分为多少个城市? 思路: 并查集 代码: #include<iostream> #include<set> using namespace std; class UnionFindSet{ private: int m_nN; int* m_pParent; public: UnionFindSet

最小生成树模板+并查集(隐藏)+结构体排序模板

minn[101],g[101][101],u[101]; memset(u,1,sizeof(u)); memset(minn,0x7f,sizeof(minn)); minn[1]=0; u[1]=0; i,j,k,m; total=0; for(i=1;i<=n;i++) { k=0; for(j=1;j<=n;j++) if(u[j]&&(minn[k]>minn[j])) k=j; u[k]=0; for(j=1;j<=n;j++) if(u[j]&

编程算法 - 食物链 并查集 代码(C)

食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种. 已知A吃B, B吃C, C吃A. 按顺序给出两种信息K条. 第一种: x和y属于同一类. 另外一种: x吃y.  信息之间可能会出错和矛盾, 求不对的信息数. 比如: 有N=10仅仅动物, 给定K=7条信息. (1) 1: x=101, y=1; 出错:没有101的动物. (2) 2: x=1,

【LCA】Tarjan离线算法(并查集+dfs)模板

vector <int> Q[N]; int Find(int x) { if(x != fa[x]) return fa[x] = Find(fa[x]); return x; } void Union(int x, int y) { int fx = Find(x), fy = Find(y); if(fy != fx) fa[fy] = fx; } void dfs(int u) { anc[u] = u; for(int i = head[u]; ~i; i = e[i].next)