只有把x和y的最终父节点(前驱)连接起来,所属的两个集合才算真正完全连通,整个逻辑也才能正确。 二、扩展域并查集 使用情景: n个点有m对关系,把n个节点放入两个集合里,要求每对存在关系的两个节点不能放在同一个集合。问能否成功完成? 思路: 把每个节点扩展为两个节点(一正一反),若a与b不能在一起(在同一个集合),则把a的正节点与b的反节...
扩展域并查集就是指:将并查集的状态由基本的:几个元素属于朋友,则放入并查集; 扩展为更多状态。 更多通过题目来理解把。 P2024 [NOI2001] 食物链 题意 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。 A吃 B,B 吃 C,C 吃 A。 现有N 个动物,以 1∼N 编号。 每个动物都是 A,B...
(其实是与关系2是相互的) 那么,我们要维护三个逻辑关系,即有联通性,又有对立性,就要用(三元)种类并查集(扩展域并查集) 了。 实际上就是把一个并查集扩大三倍,在每个并查集里维护联通性,即同类关系;在三个并查集之间维护对立性,即猎物和天敌关系。 实际利用 我们可以假设:(B→A→C→B,满足题干要求循环的关系...
using namespace std; const int N=1e6+5; int n,m; int p[N]; int sum[N]; int find(int x){ if(p[x]!=x)return p[x]=find(p[x]); return p[x]; } int main(){ while(scanf("%d%d",&n,&m),n||m){ for(int i=0;i<n;i++)p[i]=i,sum[i]=1; while(m--){ int ...
True Liars[扩展域并查集] 传送门 每个点拆成两个,表示好人或坏人 我们合并集合后,发现存在几组对立的集合 也就是说这个集合和与它对立的集合只能选一个 我们用rt1[i] , rt2[i] 表示第i个集合 和 与第i个集合对立的集合 cnt1,cnt2表示该集合好人的个数...
简介:Codeforces Round #747 (Div. 2) D. The Number of Imposters(扩展域并查集 带权并查集) linkkk 题意: 有n个人,m对关系,每对关系u , v表示u说v是s。每个人有两个身份,船员和冒名者,船员的话全部为真话,冒名者的话全部为假话。问最多有多少个冒名者。
扩展域并查集可以维护多组关系,并且可以不⽤推像带权并查集那样繁琐的式⼦,对于博主这种蒟蒻绝对适⽤ 其主要思想是将⼀个点拆分成好⼏个点来维护多组关系。直接讲不是很形象,我们来看⼀道例题 题⽬描述 S城现有两座监狱,⼀共关押着N名罪犯,编号分别为1−N。他们之间的关系⾃然也极不和谐。...
扩展域并查集:我们把每个动物拆成3个节点,分别是同类域xself,捕食域xeat,天敌域xenemy。 #include <iostream>#include<cstdio>usingnamespacestd;constintmaxn = 3e5+7;intf[maxn];intget(intx) {if(x ==f[x]) {returnf[x]; }introot =get(f[x]);returnf[x] =root; }intmain() {intn, m...
扩展域并查集常用来维护多组关系的集合合并问题 比如维护两个有敌对关系的集合,就可以用扩展域并查集食物链首先我们定义一个物种a a的天敌为a + n a的猎物为a + n * 2 可以得出 a + n -> a -> a + n * 2 a + n * 2 -> a + nhighlighter- arduino...
账号分配权重【扩展域+虚拟并查集】 #include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'usingll =longlong;usingpii = pair<int,int>;constdoublePI =acos(-1);constintN =1e5+10;constintmod =1e9+7;intf[N];intnum[N];intfind(intx){if(f[x]==x)returnf[x];elsereturnf[x]=find(f...