Disjoint set
文章平均质量分 63
wust_tanyao
这个作者很懒,什么都没留下…
展开
-
hdu 1856 More is better --- 并查集
并查集 求最大的集合里元素个数 貌似方法有很多。。 #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int r[10000005],vis[原创 2014-03-04 18:19:23 · 850 阅读 · 0 评论 -
poj 1611 The Suspects --- 并查集
共n个人,编号0~m-1,分为m组,组内人有关系,求与0有关系的人的个数 #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int原创 2014-02-28 17:54:44 · 876 阅读 · 0 评论 -
hdu 1272 小希的迷宫
并查集 判断是否有环、未给出点数判断集合数是否大于1 就是判断是否是最小生成树吧 判断有环: 若输入两点的根相同则有环 判断所有点是否都在同一集合内: 此题有点不严谨吧,还是看了别人代码才知道,给的点是一个区间内的所有点。 合并过程中把出现的点都标记,把最小和最大的找到,枚举,看有几个根,有几个根就有几个集合。 #include #include #inc原创 2014-03-04 19:32:00 · 911 阅读 · 0 评论 -
hdu1811 Rank of Tetris --- 拓扑排序
相等的用并查集处理 剩下的部分就拓扑排序 这里是用队列写的 若所有点都有正确的大小关系顺序 就合法 否则conflict 其次一个点对应多个下一级 就不确定 #include #include #include #include #include #include #include #include #include #define inf 0x3原创 2014-03-17 20:37:47 · 832 阅读 · 0 评论 -
wust April Chanllenge 2014 D题 poj2236 Wireless Network
n台电脑,在其正常时能与 开始,所有电脑都坏掉了,O a表示修好了a电脑,S a b查询a b电脑是否可通信 每次修好一台电脑,就枚举一遍所有已经修好的电脑,判断他们是否在d范围内,是的话就并查集合并 #include #include #include #include #include #include #include #include #include #d原创 2014-04-03 23:12:37 · 990 阅读 · 0 评论 -
hdu2818 Building Block
简单的种类并查集 每次用并查集模板合并时 因为小的合并到大的上面可以减小树的高度 所以每次都是判断大小再合并的 但是这种题目 为啥这样就错列?只能从一堆合并到另一堆 此题中,vis[a]存a为根的集合元素个数,num[a]存a所在的集合元素个数 merge和root的过程和树的形状、包括递归顺序无关的吧? #include #include #include #in原创 2014-03-11 21:51:50 · 999 阅读 · 2 评论 -
hdu3172 Virtual Friends
水题,边合并边输出就行了,所以可以在merge里面输出比较方便 #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define ll __int64 using namespace std; map f原创 2014-03-10 18:02:49 · 880 阅读 · 0 评论 -
hdu1598 find the most comfortable road
找一条路,使路径中结点权最小和最大的差最小。 按权值从小到大排序,枚举起点终点,并查集判断要求的起点终点是否连通。 哎 好多麻烦题 就暴力暴力着思路就出来了 #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #原创 2014-03-12 21:38:02 · 833 阅读 · 2 评论 -
hdu2473 Junk-Mail Filter 设虚父结点删除节点
并查集之删除节点。。。 真的不想再天天做并查集了。。 这题目真是做不完。。 这一道一来又不会。。。 删除节点呢,具体的过程比较复杂,为了简单起见, 我们开始给节点初始化时,就给每个节点一个虚父节点 合并、找根的过程都不影响 而删除的时候,就把要删除的节点指向无意义的点 这样消失的不知不觉 也不会影响跟自己有关系的点。。。 #include #includ原创 2014-03-12 21:34:26 · 896 阅读 · 0 评论 -
poj 1182 食物链
并!查!集!好!难!啊! 看了两天才看懂我对自己的智商完全没自信了╭(╯^╰)╮ 所谓的种类并查集。。一个集合代表一类,求解各类之间的关系问题。 对于本题, 首先,集合里的每个点我们都记录它与它这个集合(或者称为子树)的根结点的相对关系rank。0表示它与根结点为同类,1表示它吃根结点,2表示它被根结点吃。 0,1,2也是距离根节点的具体,rank这个树最多三层,每一层是同类的集合。原创 2014-03-06 21:32:02 · 958 阅读 · 1 评论 -
hdu3038 How Many Answers Are Wrong --- 种类并查集
题意: 给出一些信息 a b d 表示a点到b点的结点权值和等于d 问其中有多少组信息是错误的 一组信息和已经出现的信息不符就是错误的 种类并查集的关键在于找到根节点和子节点之间的关系 这里的vis[a]表示a点到根节点的距离 #include #include #include #include #include #include #include原创 2014-03-10 19:59:23 · 817 阅读 · 0 评论 -
hdu3635 Dragon Balls
乍一看还以为是线段树什么的。。 有两个操作: T A B 表示把A球所在的城市里所有球添加到B球所在的城市 Q A 表示 输出A所在的城市,A所在的城市里的球的个数,A转移了几个城市 前两个输出比较简单,关键是最后一个,相当于问A所在的城市被合并了几次 好在题目给的是 球代表的城市进行转移,这就说明,一个城市最多只能转移一次(之后就为空,就再也无法转移或被转移了) 那么移动次数原创 2014-03-10 18:19:50 · 757 阅读 · 0 评论 -
hdu 1829 A Bug's Life
并查集之判断是否是二分图 (定义:设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。) 题意呵呵呵,男女各站一边,找出那对同性恋! 这里对每一对关系a和b,把自己的另一半和之前的另一半(如果有的话)合并,即他们是一个性别的。 给原创 2014-03-05 20:00:55 · 946 阅读 · 0 评论 -
poj 2524 Ubiquitous Religions --- 并查集
并查集求不相交集合的个数 模板 #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int r[50005],n,m,vis[5000原创 2014-03-03 22:19:38 · 790 阅读 · 0 评论 -
hdu 1232 畅通工程
并查集 求集合个数 依题意,这里集合个数-1为所求 #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int r[1005],n,原创 2014-03-04 18:43:03 · 804 阅读 · 0 评论 -
wustoj 1319 球
水题并查集。 合并相同颜色的球,求不同集合数量。 #include const int maxn=10010; int r[maxn],n,m,ans,T; void init() { for(int i=0;i<=n;i++) r[i]=i,num[i]=1; } int root(int a) { if(r[a]==a) return a;原创 2015-01-16 20:27:44 · 900 阅读 · 0 评论