随笔分类 -  并查集

摘要:比赛那天下午做的。。。比赛的时候真不知道怎么做。。。亏了没做,做了我就死了。。欧拉回路我是真心不会判断啊(真的是忘了)。。。虽然离散考了86(鼓掌~),也不过是全班最高(再次鼓掌~)但是真的是恶补出来的(天赋秉异,美女上台献花)不扯淡了。。。这道题因为数据量比较大。。。500000的数据,所以用map和平常的查找肯定会TLE所以,要用到TRIE树。然后欧拉通路的判定就是通过查找度数为奇数的节点 < 2 是否成立不成立肯定是错的,但是成立了也要判断是不是父节点是否为一个节点。比如red redblue blue答案就是impossible代码如下View Code 1 #include & 阅读全文
posted @ 2012-08-21 20:26 某某。 阅读(185) 评论(0) 推荐(0)
摘要:最近做了点并查集的题,感觉也挺简单的。下面对我这段时间关于并查集的学习,做一下小结。并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系。并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个集合操作转换为对根节点(或称该集合的代表元素)的操作,一个集合里的元素关系不一定确定,但相对于根节点的关系很明了,这也是为了查找方便。并查集优化方法:按秩合并和路径压缩的配合使用,使得查找过程优化到极致。按秩合并,每次将深度小的树合并到深度大的树里面去,使得整棵树尽量矮;路径压缩,将当前节点到根节点路径上的所有点直接 阅读全文
posted @ 2012-08-03 19:35 某某。 阅读(202) 评论(0) 推荐(0)
摘要:这道题根同性恋那道题相当像无非就是看他有没有合并过、记录合并之后的那个点的关系罢了。View Code //AC代码1#include <stdio.h> #include <stdlib.h> int set[100005],num[100006],h[100005]; int find(int x) { if(x!=set[x]) { int y = set[x]; set[x] = find(set[x]); num[x] = (num[x]+num[y])%2;//一定要写这个%2不知道为什么不加%2他就wa加上就ac我郁... 阅读全文
posted @ 2012-07-26 16:06 某某。 阅读(209) 评论(0) 推荐(0)
摘要:首先看到这个题号的时候我想起了好公民,韩寒同学和他的不死鸟= =本人二蛋一枚,近日做了些并查集的东西但是一直不太明白怎么才能查节点路径,而且觉得要是迭代的时候加了r[x]的话会出现多加的情况,后来经网上高人指点(觉得还是好人多,虽然自己确实不想做好人了= =)明白了~一下是高人话语~voidmerge(int a,int b){ father[a]=b; place[a]+=number[b]; number[b]+=number[a];}intFind(int a)//检查找和路径压缩{if(father[a]==-1)return a;int tmp=father[a];... 阅读全文
posted @ 2012-07-26 10:26 某某。 阅读(296) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=2492大意大概解释给你一个t代表多少个case,然后有n个虫子,m个谁喜欢谁,这种虫子跟咱们一个货色只有两种性别,男的,或者是母的,然后就是让你算算有没有高搞基或者是百合。大体思路就是用并查集,然后用一个数组算这个节点到根节点的长度,然后看相同具有相同祖先的是不是有相同的长度%2.//昨天心情不大好特别想回家,一下午再看这道题晚上偷懒一直在看视频。。。//一开始觉得无非就是查看这个节点的深度,然后一直打算用h去计算,后不断地wa然后就想了想h是指该节点到最底下的那个高度,然后就开始用了另一个数组num去储存离跟节点的长度,也就是一 阅读全文
posted @ 2012-07-22 17:41 某某。 阅读(259) 评论(0) 推荐(0)
摘要:题目连接 :http://poj.org/problem?id=2524题目大意。已知有n个大学生,其中有m对宗教信仰相同的学生,请你估算这n个学生中最多有多少种宗教信仰。不多说直接上代码~View Code #include<stdio.h>int set[50005];int find(int x){ int r = x; while(set[r] != r) { r = set[r]; } return r;}void merge(int a,int b){ a = find(a); b = find(b); if(a == ... 阅读全文
posted @ 2012-07-17 14:13 某某。 阅读(139) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1272本人若菜,最近做题的时候遇见了这个所以才开始接触并查集。用并查集来检查连通性也就是检查最小生成树。最小生成树的点减去边的差值为一,且在同一个集合内。因此,判断条件有二:一没有产生回路,二点数减去边数为1;可以得到如下代码我们用t来储存点数与边数之差,当产生一条非回路的时候t--,出现一个点t++;while(scanf("%d %d",&a,&b)&&a||b) { if(merge(a,b) == 0)//是已经一个属于同一个集合,也就是说 阅读全文
posted @ 2012-07-17 11:30 某某。 阅读(442) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1611题目大意:有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数。这道题是并查集的题目。没什么好多说的比较简单~#include<stdio.h>int set[30005],h[30005],num[30005];void init(int m){ int i; for(i = 0;i < m;i++) { set[i] = i; h[i] = 0; ... 阅读全文
posted @ 2012-07-16 23:57 某某。 阅读(157) 评论(0) 推荐(0)