Union-Find(并查集): Quick find算法】的更多相关文章

解决dynamic connectivity的一种算法:Quick find Quick find--Data sturcture 如果两个objects是相连的,则它们有相同的array value. Quick find--find&union operation Find很好实现,只需要查看它们的值是否一样就可以了 Union有点复杂,我们需要将其中的一个component里面所有的objects的值都改为和另一个component的值一样(merge components) Quick…
并查集:使用并查集可以把每个连通分量看作一个集合,该集合包含连通分量的所有点.这两两连通而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别.#define N 100 int father[N]; void init() { for(int i=0;i<n;i++) father[i]=1; } void union(int x,int y) //合并两元素所在集合 { x=getfather(x); y=getfather(y); if(x!=y) fathe…
本文是对http://noalgo.info/476.html的一点理解,特别是对其中 int father[mx]: //节点的父亲 int ancestor[mx]; //已访问节点集合的祖先 这两个数组作用的解释: 首先必须明确,并查集重建的树跟原来的树并不一样: 还是借用该文章的例子: Tarjan算法是基于DFS(深度优先搜索), 图中的树深度优先遍历的顺序应该是: ->->->->->->-> 但作者却说,节点的处理顺序为: ->->-&g…
转自:https://libhappy.com/2016/03/algs-1.3/ 假设在互联网中有两台计算机需要互相通信,那么该怎么确定它们之间是否已经连接起来还是需要架设新的线路连接这两台计算机.这就是动态连通性问题. 动态连通性问题在日常生活中十分常见,比如上文所说的通信网络中的连通性问题,比如物理化学中的渗流问题.通过并查集这种数据结构及union-find 算法可以解决动态连通性问题. 动态连通性问题 概念 给出一系列的对象时,让其支持以下的两个操作: 判断两个对象是否相连 使两个对象…
Quick union算法 Quick union: Java implementation Quick union 性能分析 在最坏的情况下,quick-union的find root操作cost(访问array的次数)会达到N. 所以quick-union的性能也不好.…
Quick union improvements1: weighting 为了防止生成高的树,将smaller tree放在larger tree的下面(smaller 和larger是指number of objects),而不是将larger tree放在smaller tree的下面(如上图中的第一种情况) Examples: quick-union & weighted quick-union 从上面的这个例子可以看到用quick-union时的树的高度很大,而用weighted qui…
Intro 想象这样的应用场景:给定一些点,随着程序输入,不断地添加点之间的连通关系(边),整个图的连通关系也在变化.这时候我们如何维护整个图的连通性(即判断任意两个点之间的连通性)呢? 一个比较简单的solution是每个点都有一个便签,标记它属于哪个连通子图.这种做法就有一个很明显的问题 -- 牵一发而动全身,因为每个节点所属的组号(标签)都是单独记录,各自为政的,没有将它们以更好的方式组织起来,当涉及到修改的时候,除了逐一通知.修改,别无他法.所以现在的问题就变成了,如何将节点以更好的方式…
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. 输入:     测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M (N, M < =100 ):随后的…
题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w.有m次询问,每次询问房子a,b之间的距离是多少. 分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次询问a.b之间的距离=d[a]+d[b]-2*d[LCA(a,b)];LCA(a,b)是a,b的近期公共祖先. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include…
这题计算 一张图上 能走的 点对有多少个  对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <vector> #include <queue> using namespace std; ; typedef long…
相关介绍:  并查集的相关算法,是我见过的,最为之有趣的算法之一.并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.其相关的实现代码较为简短,实现思想也简单易懂,处理问题的效率也高,解决的问题范围也较广.  为了实现并查集的相关算法,我们规定将对象称之为触点,将整数对称之为连接,将两两之间彼此互不相连的各个集合的分布(也就是其相关的等价类)称之为连通分量,也称为分量.同时定义了如下的API用来封装其所需的基本操作: public class UF…
概念: 并查集是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的Kruskal 算法和求最近公共祖先等. 操作: 并查集的基本操作有两个: Union(x, y):把元素x 和元素y 所在的集合合并,要求x 和y 所在的集合不相交,如果相交则不合并. Find(x):找到元素x 所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了. 实现: 并查集的实现原理也比较简单,就是使用树来表…
1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现   2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两个数据.判断两个数据是否属于同一集合(两个数据是否连接)   3.. 定义并查集的接口 并查集的接口业务逻辑如下: public interface UF { int getSize(); boolean isConnected(int p, int q); void unionElements(int p,…
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 friends know each other, and all the friends do not want…
时间限制(普通/Java):5000MS/15000MS     内存限制:65536KByte 描述 NKU ACM最近要举行足球赛,作为此次赛事的负责人,Lee要对报名人员进行分队.分队要遵循如下原则: 一个人不能加入多支队伍:不认识的人不能分在同一队:如果a和b认识,b和c认识,那么认为a和c也认识:每支队伍上限8人,下限5人:尽量使队伍满员.由于参赛人数很多,Lee表示无能为力,所以请你帮助Lee编程解决比赛有多少队伍. 输入 第一行输入两个整数,n和m,n(1<=n<=300000)…
Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5469    Accepted Submission(s): 1756 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 Description: Presumably, you all have k…
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G).其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合.显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树. 深度优先生成森林   右边的是深度优先生成森林: 连通图的生成树不一定是唯一的,不同的遍历图的方法得到不同的生成树;从不…
动态连通性 . 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. 为了实现这个效果,我们设计并查集这种数据结构来保存程序已知的所有整数对的足够多的信息,并用它们来判断一对新对象是否连通,这个问题通俗地叫做动态连通性问题. union-find算法的api 为了方便,我们把每个对象称为触点,使用一个触点为索引的数组id[]作为基本的数据结构来表示所有分量,对于每个…
<ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元素构成单元素集合,然后按照一定顺序将同属一组的集合合并,期间要反复查找每一个元素在哪个集合中.这类问题往往看似简单,但是数据量很大,因此容易造成TLE或MLE,也就是空间度和时间度极其复杂.因此在这里,我们引入一种抽象的特殊数据结构——并查集. 并查集:类似一个族谱,每个结点均有一个father[x]来表示x…
本文来自:http://www.cnblogs.com/Findxiaoxun/p/3428516.html 写得很好,一看就懂了. 在这里就复制了一份. LCA问题: 给出一棵有根树T,对于任意两个结点u,v求出LCA(T, u, v),即离根最远的结点x,使得x同时是u和v的祖先. 把LCA问题看成询问式的:给出一系列询问,程序应当对每一个询问尽快做出反应. 对于这类问题有两种解决方法;一是用比较长的时间做预处理,但是等信息充足以后每次回答询问只需要用比较少的时间.这样的算法叫做在线算法.…
原文链接:http://blog.csdn.net/dm_vincent/article/details/7655764 本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find. 更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧. 原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法.我觉得这个可能更加有意义一些,相比于记下一些结论. 关于动态…
并查集 并查集处理的是集合之间的关系,即‘union' , 'find' .在这种数据类型中,N个不同元素被分成若干个组,每组是一个集合,这种集合叫做分离集合.并查集支持查找一个元素所属的集合和两个元素分别所属的集合的合并. 并查集支持以下操作: MAKE(X):建立一个仅有成员X的新集合. UNION(X,Y):将包含X和Y的动态集合合并为一个新集合S,此后该二元素处于同一集合. FIND(X):返回一个包含X的集合. 注意:并查集只能进行合并操作,不能进行分割操作. 并查集的实现原理 并查集…
今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀分布,哈希函数的离散性,打乱输入规律 public class Code_01_HashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.p…
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻找n-1条边,恰好将这n个节点相连,并且这n-1条边的权值之和最小. 对于MST问题,通常常见的解法有两种:Prim算法   或者  Kruskal算法+并查集 对于最小生成树,一定要注意其定义是在无向连通图的基础上,如果在有向图中,那么就需要另外的分析,单纯用无向图中的方法是不能得出正确解的,这一…
#1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的相关信息,并且搭建了一个小小的网站来应付来自四面八方的请求. 但正如我们所能想象到的……这样一个简单的算法并不能支撑住非常大的访问量,所以摆在小Hi和小Ho面前的无非两种选择: 其一是购买更为昂…
一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0cd" alt="">的近期公共祖先.指的是二者的公共祖先中深度最高的节点. 给定随意两个树中的节点,求它们的近期公共祖先. 对于二分查找树.二叉树,能够用普通的dfs实现.但对于多叉树.查询次数频繁的情况下.离线Tarjan算法的长处就显现出来了.因为对树上全部节点仅仅进…
概念 并查集是一种树形的数据结构,用来处理一些不交集的合并及查询问题.主要有两个操作: find:确定元素属于哪一个子集. union:将两个子集合并成同一个集合. 所以并查集能够解决网络中节点的连通性问题. 基本实现 package com.yunche.datastructure; /** * @ClassName: UF * @Description: 并查集 * @author: yunche * @date: 2018/12/30 */ public class UF { /** *…
WiKi Disjoint是"不相交"的意思.Disjoint Set高效地支持集合的合并(Union)和集合内元素的查找(Find)两种操作,所以Disjoint Set中文翻译为并查集. 就<算法导论>21章来讲,主要设计这几个知识点:  用并查集计算图的连通区域:  推断两个顶点是否属于同一个连通区域:  链表实现并查集:  Rooted tree实现并查集:  Rooted tree实现并查集时採用rank方法和路径压缩算法. <算法导论>21…
一.动态连通性(Dynamic Connectivity) Union-Find 算法(中文称并查集算法)是解决动态连通性(Dynamic Conectivity)问题的一种算法.动态连通性是计算机图论中的一种数据结构,动态维护图结构中相连信息.简单的说就是,图中各个节点之间是否相连.如何将两个节点连接,连接后还剩多少个连通分量.有点像我们的微信朋友圈,在社交网络中,彼此熟悉的人之间组成自己的圈子,熟悉之后就会添加好友,加入新的圈子.微信用户有几亿人,如何快速计算任意两个用户是否同属于一个圈子呢…
一.什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个用于次数据结构的操作: Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集. Union:将两个子集合并成一个集合. 二.主要操作 初始化:把每个点所在的集合初始化为其自身. for(int i=1;i<=n;i++) f[i]=i; 查找:查找元素所在的集合,即根节点. int find(int x)…