数据结构:并查集
文章平均质量分 91
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
2016 UESTC Training for Data Structures C - 卿学姐与诡异村庄 并查集
并查集来维护,然后分好类如果A说B是好人,把Ag 和 Bg 合并 他们是一伙的,都是good men; 把Ab 和 Bb 合并 他们是一伙的都是bad men如果A说B是坏人,把Ag 和 Bb 合并 他们不是一伙的; 把Ab 和 Bg 合并 他们不是一伙的☺☺然后笔者自己的处理方法就是father[2*maxn],之所以是2倍的maxn, 是因为 father 1 ~ n 表示good men的初始集合,n+1 ~ 2*n表示bad men的初始集合原创 2016-05-01 00:01:50 · 1401 阅读 · 0 评论 -
AtCoder Petrozavodsk Contest 001 D - Forest 连通块+并查集+贪心
题意:给出一个由n个点m条边构成的森林,每个点有个权值val[i],额外加一条边(u,v)的花费是val[u] + val[v],且u、v只能被用到一次,添加一些边使得图连通,求最小花费。连通块+并查集+贪心可以先用并查集跑出连通块的个数为x,则需要添加的边的数量为x-1条,需要使用的点的个数为2*(x-1),所以只要n>=2*(x-1)则必定有解。所以我们只要贪心的选出这2*(x-1)个点即可,故先在每个连通块选择一个权值最小的点,这样可以保证每个连通块都会有点和其它的连通块相连,然后剩余的2*(x-原创 2018-02-05 21:52:00 · 804 阅读 · 2 评论 -
Gym - 101173F Free Figurines 思维题+并查集
题意:给出一个序列ai 表示i的父节点是ai, 再给出一个序列bi 表示i的父节点是 bi,求i < ai, ai为0则表示没有父节点,否则ai都不相等,bi同理。只能进行2个操作,1、 把一个没有父节点的节点 作为 一个 没有父节点和子节点的 节点 的子节点, 代价为 1;2、把一个没有父节点的节点的子节点去掉,代价为1;思维题+并查集关键是正确的读懂2个操作,即可,即只能对free的节点进行操作,所以当ai!=bi时,要先把ai拆掉,但必须先满足ai为free才能把i变成free,同理把i插原创 2017-07-21 00:55:05 · 1489 阅读 · 4 评论 -
UESTC 1586 可以说是非常豹笑了 2-SAT+并查集
题意:n个数,m个关系,每个关系表示T==1则a、b两数相同,T == 0则a、b两数不同。要求判断关系是否没有矛盾。2-SAT+并查集有一个大小为2*n的并查集,如果a、b天相同,则把a和b,以及a+n和b+n,合并,如果a、b天不同,则把a和b+n,以及a+n和b,合并,然后i= 1 ~ n,扫一遍,如果 a和a+n在同一颗树中,则相矛盾,因为不可能那天表情即一样又不一样,答案为NO,反正为 YES复杂度 O(2*n)原创 2017-05-16 19:38:06 · 1799 阅读 · 0 评论 -
UESTC 1594 老司机的奇幻漂流 并查集+食物链
题意:三个东西构成一个食物链关系,A->B, B->C, C->A,给出m条关系,问是否有矛盾。并查集 食物链每个点有三个成员A、B、C,当X和Y是同类时, _merge(X, Y), _merge(X+n, Y+n), _merge(X+2*n, Y+2*n);当X攻击Y时, _merge(X+n, Y), _merge(X+2*n, Y+n), _merge(X, Y+2*n);每次判断是否 if(x > n || x < 1 || y > n || y < 1){原创 2017-05-16 19:28:49 · 962 阅读 · 0 评论 -
Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 2-SAT、并查集
题意:每个门有且必须被2个开关所控制,一个开关可以控制多个门,给定n个门的初始状态和每个开关控制哪些门,问是否有方案打开一些开关使所有的门都为unlocked状态。2-SAT、并查集把由于每个门被2个开关控制,所以把门看成是边,把开关看成是点,每个开关有2种点,打开i和关闭i+m,从而变成一个经典的 2-SAT 问题。一个门分别被last[r] 和 i控制,则如果门是开的,则2个开关要么都关要么都开,_merge(last[r], i); _merge(last[r] + m, i + m);否原创 2017-03-22 01:26:12 · 1027 阅读 · 0 评论 -
AtCoder - 2159 Connectivity 并查集+二分、快速的求出2个集合的交集
题意:分别有一个road网络和一个railway网络,求每个点在2个网络中都连通的点的个数。并查集+二分先用并查集维护出2个网络的连通关系,然后把这些树转移到 map<int, vector<int>> mp里,//bitset 超时每次对于每个i,如果没有计算过ans,则比较mp1[_find(i)]和mp2[_find2(2)]这2个vector里相同的元素的个数,并且这些相同的数它们的ans都是一样的,比如把这些相同元素维护到一个map<int, bool> m里,则所有的m.first的a原创 2017-01-17 19:27:48 · 965 阅读 · 0 评论 -
Codeforces Round #385 (Div. 2) C. Hongcow Builds A Nation 并查集+贪心+组合学、图论、dfs
题意:有n个点(其中有k个关键点),m条边,要求添加尽可能多的边使得k个关键点之间没有路径,问最多可以添加多少条边。并查集+贪心+组合学、图论、dfs用并查集处理这个图,相关联的点构成一颗树,然后把每棵树的结点数储存在该树的根节点上,然后开始贪心,找出k个关键点里,关键点所在树的结点个数最多的结点 maxci,然后把这个ci 以及它所关联的点 与 所有没有关键点出现的树相结合(free),形成一个连通块,这个连通块的总边数是 (free + maxcnt) * (free + maxcnt - 1)原创 2017-01-10 23:20:45 · 752 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses 并查集+双重01背包
题意:一堆人,这些人构成一些集合,2个元素至少有一条路径则为同一个集合,对于这些集合每个交合要么全取要不去不超过一个人,且每个人有一个wi和ai,要求在总wi小于等于w的情况下,是总ai最大并查集+双重01背包先用并查集处理出ptr-1个集合,然后对于这ptr-1个集合要么全取要么去不大于1个,跑一边01背包。dp[i][j]表示到 第i个背包是,总消耗容量j是最多装 dpij的东西。复杂度 O(N^2)原创 2017-01-10 18:50:54 · 708 阅读 · 0 评论 -
Codeforces Round #376 (Div. 2) C. Socks 并查集+贪心、图论
并查集+贪心、图论在读入的时候直接把有边相连的点维护到一个集合里,最后对于处理出的森林,可以用map<int, map<int, int> > mp;维护,即mp[i][j]表示以 i 为根的树上颜色 j 出现的次数,然后对于每颗树,找出树上出现的次数最多的结点颜色相同的颜色, ans += (该树的总结点数) - 出现的次数最多的结点颜色相同的颜色的结点个数复杂度 O(n)原创 2016-10-22 12:31:39 · 1151 阅读 · 0 评论 -
URAL 1962 In Chinese Restaurant 并查集
并查集以前好像做过类似的题首先如果一个节点有sz[i] > 2 则 ans = 0如果有环, 而且不是最大的环, 则ans = 0如果是最大的环, 则ans = 2 //! 最开始误认为是1, 白白WA了2发, 然后才明白 顺时针和逆时针2种方案剩下的就是常规的ans了先是求树的全排列, // 更像是圆排列 A(n, n) / n 或者说把1的位置固定然后求全排列然后对于每个树:1)只要节点数大于1, 都会有2头无论是不是直链, 都和直链一样因为如果有2个分支, 那么那两个分支自己必须原创 2016-07-27 00:07:26 · 1206 阅读 · 1 评论 -
UVALive 6910 Cutting Tree 并查集
简单并查集给出一片森林, 然后执行1)切断 x和x的父节点的边, // 查询的时候不进行路径压缩, 然后直接 father[ x] = x2)查询 x, y 是否是相连通的 //分别找x y的根, _find(x) == _find(y)复杂度 O(n)原创 2016-08-03 22:54:07 · 705 阅读 · 0 评论