数据结构 --- 并查集
playwfun
宁静致远
展开
-
UVA -2232(并查集 + 位运算)
首先,说些关于异或的信息,异或满足交换律和结合律,这为用并查集创造了条件。 又有 a^b= x, b^c=y; a^c=x^y; 本题目有三种操作,两种存,一种查。对于建立并查集时候要维护两个信息,第一个就是当前节点和root异或的值,当前集合是否存在已知量(之需要确保根部知道这个情况就可以,一个集合里有一个一致,那么该集合任一元素都可以通过异或得到) 查的时候分为两种情况,第一种该元原创 2015-03-19 17:03:22 · 409 阅读 · 0 评论 -
HDU---3038(并查集好题)
对于x - y 的和为z认为y 比 (x-1)大z。 即对 x-1 和 y 建边构造并查集并维护每个点到其父节点的Sum值、 #include #include #include #include #include #include #include using namespace std; typedef long long LL; #define rep(i,n) for(i原创 2015-03-18 13:45:34 · 434 阅读 · 0 评论 -
ZOJ 3261 (并查集+离线算法)
本题正方向求解十分困难。但倒过来就变成了普通问题。这就是离线算法的好处之一。 只是在联合不同节点时候要总以节点能量最大且编号尽量小的做根节点。 #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i,n原创 2015-03-18 19:46:12 · 673 阅读 · 0 评论 -
UVA 1665(并查集题目)
本题目的意思是给定一个n*m的数阵(n,m 思路: 给所有格子按权排序,从大到小处理这T个数,每次只需把满足条件的格子加入并查集,并在合并过程中动态统计联通分量的个数。 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #inc原创 2015-09-17 11:00:50 · 890 阅读 · 0 评论 -
codeforces 593D(并查集 + LCA)
题意不在描述. 首先我们注意到改变每个点的值时,只会变的更小,每次要除的数为1e18 , 由于log2(1e18) <= 60 .那么最多只需要除以至多60次大于等于2的数变回变成0,所以我们 只以任意一点为根建立有根树,并且在每次遍历一条链时进行压缩,当该路经值为1,应该被压缩,每次走到多余六十个点直接结束。 #include #define fst first #define snd原创 2015-11-09 10:19:21 · 742 阅读 · 0 评论