
并查集
文章平均质量分 78
vsooda
这个作者很懒,什么都没留下…
展开
-
并查集 (Union-Find Sets)
如果:给出各个元素之间的联系,要求将这些元素分成几个集合,每个集合中的元素直接或间接有联系。在这类问题中主要涉及的是对集合的合并和查找,因此将这种集合称为并查集。 链表被普通用来计算并查集.表中的每个元素设两个指针:一个指向同一集合中的下一个元素;另一个指向表首元素。 链结构的并查集 采用链式存储结构,在进行集合查找时的算法复杂度仅为O(1);但合并集合时的算法复杂转载 2012-02-26 13:12:09 · 1106 阅读 · 0 评论 -
HDU 1272
/分析解决方案很明显的一个用并查集解决的问题:如果只用一个根肯定满足要求,遍历数组即可 //如果某两个要合并的节点同根肯定会构成回路,不满足要求 这里用sign 标记是否出现了同根,分两种情况处理即可 #include #include using namespace std; struct node { int parent; int weight; };原创 2012-02-28 13:01:41 · 695 阅读 · 0 评论 -
HDU 1879
#include #include #include #include using namespace std ; #define MEM(a, v) memset (a, v, sizeof (a)) // a for address, v for value #define max(x, y) ((x) > (y) ? (原创 2012-02-28 11:01:20 · 859 阅读 · 0 评论 -
HDU 1213
#include using namespace std; const int maxn=1005; struct Node { int parent;//保存父节点 int rank;//以此为父节点的人数 }people[maxn]; void init(int n) { int i; for(i=0;i<=n;i++) { people[i].parent=i; peop原创 2012-02-28 12:01:57 · 673 阅读 · 0 评论 -
HDU 1232 畅通工程(与1856类似 )
这个题目也是典型的最小生成树算法的利用,不同于其他的题目就在于其它要求的是要添加的边的最少数目,使得任意两 点都有联系,利用并查集算法 ,在题目已经给出的map基础上,统计两棵树相并的次数,即使要添加的路径的最少数目。 #include #include int father[1001],tot; int find(int x) { int r=x; while(r!=fat原创 2012-02-26 14:06:21 · 536 阅读 · 0 评论 -
HDU 1856
题目大意:老师选小男孩参加一个项目。要求选上的小男孩都能够直接或间接地相互认识。给你多对数,每对表示这两个小男孩是直接地相互认识,求出老师最多能选到多少个小男孩。 最简单最基本的并查集。#include using namespace std; const MAXN =10000005; struct Node { int parent;//保存父亲结点 int rank;//从此小男孩为父原创 2012-02-26 13:34:17 · 695 阅读 · 0 评论 -
并查集
并查集的学习告一段落,整理总结一下与大家共勉~ 并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数、最小公共祖先、带限制的作业排序,还有最完美的应用:实现Kruskar算法求最小生成树。其实,这一部分《算法导论》讲的很精炼。 一般采取树形转载 2012-02-26 12:51:23 · 7459 阅读 · 0 评论 -
并查集知识
并查集:(union-find sets) 一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。 并查集的精髓(即它的三种操作,结合实现代码模板进行理解): 1、Make_Set(x) 把每一个元素初始化为一个集合 初始化后每一个元素的父亲节点转载 2012-02-26 12:25:36 · 845 阅读 · 0 评论 -
HDU 1116
这个题目要运用到欧拉路得相关知识,并且也要并查集,题目说的是:给你n个单词,要你判断这些单词能不能首尾相连。理解题目意思后,进行转化,输入字符串,提取首位字母作为下标来表示两节点的出现,以及相对应节点入度和出度的增加,转化为并查集的应用即可。那么从可以想象一幅由首位字母节点构成的图,当且仅当图是一条欧拉回路或者欧拉通路的时候,才能满足题目的要求,至于欧拉回路和欧拉通路的判定可以总结为如下: 1)原创 2012-02-26 19:21:33 · 1614 阅读 · 0 评论 -
HDU 2473 并查集加速 good
想了几中办法,甚至加入了后继结点,但是一直超时,最后参考了网上代码。原文地址:http://www.cppblog.com/MiYu/archive/2010/08/26/124771.html 题目分析: 题目的意思大概就是 有N 封邮件, 编号 0 -> N-1, 然后有2种操作, M : 合并操作, 将 2 种邮件合并为一种.转载 2012-09-18 11:27:03 · 796 阅读 · 0 评论