随笔分类 - 并查集
摘要:原题链接:http://poj.org/problem?id=3908 这道题实际上问的是:如何在并查集上删除一个节点但保持连通性(可删节点并查集)。其做法是新开一个pos[]数组,其初始化pos[i]=i,第k次删除节点那么pos[i] = n + k(实际上开辟了一个新节点,并用原节点和新节点做映射),以后再次访问节点 i 的时候用的是pos[i]。 1 #include <stdio.h> 2 #include <string.h> 3 const int maxn = 50000 + 5; 4 5 int f[maxn]; 6 int pos[maxn]; 7
阅读全文
摘要:原题传送:http://poj.org/problem?id=2513 字典树 + 并查集 + 欧拉路。 字典树:相当于hash的功能 并查集:判断连通 欧拉路:求答案 要存在欧拉路就要满足: 1.该图必须是一个连通图 2.该图每个点的度数要么全为偶数,要么有且仅有两个点的度数为奇数View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #define N 500005 5 using namespace std; 6 7 int k, f[N],g[N]; 8 ch
阅读全文
摘要:原题传送:http://poj.org/problem?id=2236 并查集。本来看到N是10^3级别,操作数P是10^6级别,那么N*P就是O(10^9)级别,一阵后怕,不停寻找Plog(N)算法,后来实在想不出,看看时间限制是10s,直接上O(10^9)碰碰运气,没想到1Y,800多ms。 这样的话实现就很容易了,但是1Y后又交了几次,用C++编译器有时ac,有时wa;而用G++虽然时间会慢一点,但是一直都是AC,神马情况?!View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define N 1002
阅读全文
摘要:原题传送:http://poj.org/problem?id=1988 一开始的想法是把下堆连到上堆去(这很符合树的结构思想),然后另外开一个数组标记录节点的值,递归的时候字节点加上这个标记的值与根节点的差值,但是发现,这样做在某些union_set时会使同一个根的所有节点标记的值错乱。 这道题需要对并查集有比较深刻的理解,多开一个数组记录堆总数。把上堆union到下堆上去,这样,总的根就是下堆的根,最上堆总是在最下层,find_set的时候就很方便求出答案。View Code 1 #include <stdio.h> 2 #define N 30001 3 4 int a[N],
阅读全文
摘要:原题传送:http://poj.org/problem?id=1984 并查集。 首先,以为k个询问中的I是乱序的,直接被吓傻了,后来看讨论版才发现I是升序的…… 这道题让我对并查集有一个新的认识:根的代表性是非常强的!并查集里如果某个节点的改动会影响到整个并查集的所有节点,那么,在union_set的时候只需要改动根节点就可以了,当然,在find_set函数里要对所有节点进行更新(这相当于一种延时标记)。我们知道,find_set函数走了两条路,一条是前往根的路,一条是从跟返回的路,那么,如果发现根已经被改动,必须在从根返回的路上更新经过的所有节点。这在find_set函数里是可以...
阅读全文
摘要:原题传送:http://poj.org/problem?id=1703 并查集。 这题更加深了对并查集的理解,以前做过差不多的类似“朋友传递”的题。这道题核心的一句话是:敌人的敌人是朋友。那么假设每个x总有一个敌人(编号为x+n),那么可以把a加入到b的敌人b+n代表的并查集中,把b加入到a的敌人a+n的并查集中。如果find(a)==find(b),那么a和b是同gang;如果find(a)==find(b+n)或者find(b)==find(a+n),那么a和b是不同的gangs;否则,not sure。View Code 1 #include <iostream> 2 #in
阅读全文
摘要:原题链接:http://poj.org/problem?id=1611 并查集。在每个group中,最开始的出发点是以该group中最小编号的学生为根的(这个是根据题意编号为0的学生是suspect来决定的),如果该group中有某个学生的父亲节点(或祖父节点)编号大于该group最小编号,则将最小编号union到上述的父亲节点(或祖父节点)上,那么在处理完成后,可以构造出一颗以编号0学生为根的树(并查集)。对所有节点询问其祖先节点,如果其祖先节点编号为0,那么计数加1。View Code 1 #include <stdio.h> 2 #include <algorithm&
阅读全文