随笔分类 - 数据结构--并查集
摘要:1320简单并查集 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int fa[1010],r[1010]; 9 int find(int x)10 {11 if(fa[x]!=x)12 fa[x] = find(fa[x]);13 return fa[x];14 }15 int main()16 {17 int i,u,v;18 int flag = 0;19 for(i = 1; i >u>>v)25 ...
阅读全文
摘要:1709简单题 并查集找下就行 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL long long 9 int fa[110];10 int w[110][110],o[110][110];11 char s[110][110];12 int find(int x)13 {14 if(x!=fa[x])15 fa[x] = find(fa[x]);16 return fa[x];17 }18 int main()1...
阅读全文
摘要:1628加了些数论知识 先看下剩余类的概念一个整数被正整数n除后,余数有n种情形:0,1,2,3,…,n-1,它们彼此对模n不同余。这表明,每个整数恰与这n个整数中某一个对模n同余。这样一来,按模n是否同余对整数集进行分类,可以将整数集分成n个两两不相交的子集。我们把(所有)对模n同余的整数构成的一个集合叫做模n的一个剩余类。对于a%k=x b%k=y 若x!=y a与b有边相连 则a的剩余类 与b的剩余类l里的元素也是可以相连的 即 a ->b->a+k->b+k->a 所以有环若x==y 则同一剩余类里元素都可以相连 a->a+k->a+2k->a
阅读全文
摘要:1701又是类似食物链的这一类题这题是找与根节点的和差关系 因为0节点是已知的 为0 那么所有的都可以转换为与0的和差关系可以规定合并的两节点 由大的指向小的 然后再更新和差关系有可能最后有的不在0集合中 这时要确定最大初值 当然根据集合中出现的负值来确定 题目中工资不能出现负值 也不可大于10^9 在处理完关系后 再判断一下这两个条件 不满足的话就输出m 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 50010 9 #define LL.
阅读全文
摘要:1003看篇国家论文《从《parity》的解法谈程序优化》对于区间i,j 如果用sum[i],sum[j]来表示到i的1的个数的奇偶性 那么仔细想下 sum[i-1] 若与区间i,j相等 则sum[j]为偶 否则为奇那么就可以把性质相同的合并在一个集合里 性质相同为朋友 不同为敌人 可以把一个端点分成两个 一个是自己一个是他的敌人 当与别的点合并时根据朋友的朋友是朋友 朋友的敌人是敌人 敌人的敌人 是朋友 这些原则 来进行合并 ,并判断是不是有矛盾端点比较大 用map离散化下 map相对其它离散化方法操作还是比较简单点 1 #include 2 #include 3 #include ...
阅读全文
摘要:1671并查集 对于询问删除边之后的连通块 可以倒着加边 最后再倒序输出 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 int p[N],father[N],a,b,f[N]; 9 int pp[N];10 struct node11 {12 int x,y;13 }ed[N];14 int find(int x)15 {16 if(father[x]!=x)17 father[x] = find(father[x])...
阅读全文
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497并查集 给定一个无向图 判断s点是否在所有的环中感觉解释有点绕 边输入边判断 s不加入判断 也就是s的祖先一直是s 如果两个节点的祖先一样那说明形成了环若s在环中 那说明节点的祖先肯定是s 否则s不在其中s不参与连接 如果一个环中一个节点不跟相邻节点连接 就形不成环 除非这个节点不在这个环中View Code 1 #include <iostream> 2 #include<cstdio> 3 #include&l
阅读全文
摘要:1232模板题View Code 1 #include <stdio.h> 2 #include<string.h> 3 int father[1001]; 4 int find(x) 5 { 6 if(x!=father[x]) 7 father[x] = find(father[x]); 8 return father[x]; 9 }10 void union1(int x,int y)11 {12 father[x] = y;13 }14 int main()15 {16 int i,j,k,n,m,a,b;17 while(scanf(...
阅读全文
摘要:简单并查集 有联通的就合并在一起 最后看共有多少棵树 就有多少个灾民集中区域View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 int father[201],num[201]; 4 int find(int x) 5 { 6 if(x!=father[x]) 7 { 8 father[x] = find(father[x]); 9 }10 return father[x];11 }12 void union1(int x, int y)13 {14 father[x] = y;...
阅读全文
摘要:http://poj.org/problem?id=2492跟1703一样 两种状态 并查集+偏移量两只虫子发射架关系 判断有没有虫子是同性恋 两两合并 在一棵树上找右没有两个节点跟跟节点的关系(只有0,1两种)是相同的,相同就是gay注意一点 两组数据间有空行View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 int father[2001],num[2001],r[2001]; 4 int find(int x) 5 { 6 if(x!=father[x]) 7 { 8 int y = father...
阅读全文
摘要:并查集 r[]记录节点到跟节点的距离 num[] 树的节点数View Code 1 #include <stdio.h> 2 int father[30005],r[30005],num[30001]; 3 int find(int x) 4 { 5 if(x!=father[x]) 6 { 7 int t = father[x]; 8 father[x] = find(father[x]); 9 r[x]+=r[t];10 }11 return father[x];12 }13 14 void union1(i...
阅读全文
摘要:与1182一个思路 并查集加偏移量 不过比1182好做一些View Code 1 #include 2 int father[100005], r[100005]; 3 void init(int n) 4 { 5 int i; 6 for(i = 1 ; i <= n ; i++) 7 { 8 r[i] = 0; 9 father[i] = i;10 }11 }12 int find(int x)13 {14 if(x!=father[x])15 {16 int pre = father[x]...
阅读全文
摘要:把两个节点的关系转换为对根节点的关系的比较View Code 1 #include <stdio.h> 2 int father[50001] ,r[50001]; 3 void init(int n) 4 { 5 int i; 6 for(i = 1 ; i <= n ; i++) 7 { 8 father[i] = i; 9 r[i] = 0;10 }11 }12 int find(int x)13 {14 if(x == father[x])15 return father[x];16 else17...
阅读全文
摘要:http://poj.org/problem?id=1611题意是找出可能携带病毒的人数 就是把有交集的集合合并在一起 答案就是最后0所在集合的人数并查集的一个主要思想就是合并两个不相交集合 在这个题中 也就是不含重复元素 比如 第一个集合中的1,2 就是把1, 2合并起来作为一个集合 同时把num【】更新一下 就是集合中的元素个数 把每个集合中的第一个数作为根节点 这样集合里的所有元素的祖先就是第一个数x如果两个集合没有交集 比如1,2和10 11 12 13 14 15 这两个集合就不会合并 因为只是集合中的元素合并 1和2合并 10和其它的4个数合并 但是要是有交集1,2和0,1 这两个
阅读全文
摘要:作者:Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://dongxicheng.org/structure/union-find-set/1、 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。2、 基本操作并查集是一种非常简单的数据结构,它主要涉及两个基本操作,分别为:A. 合并两个不相交集合B. 判断两个元素是否属于同一个集合(1) 合并两个不相交集合(Union(x,y))合并操作很简单:先设置一个数组Father[x],表示
阅读全文

浙公网安备 33010602011771号