数据结构:并查集
文章平均质量分 66
skajre
这个作者很懒,什么都没留下…
展开
-
POJ 1611 The Suspects
#include #include #include #include using namespace std; const int maxn=30000+100; int pa[maxn],f[maxn]; int getroot(int a) { return pa[a]==a?a:pa[a]=getroot(pa[a]); } void merge(int a,int b) {原创 2016-07-23 13:37:20 · 168 阅读 · 0 评论 -
UVA 1329 Corporative Network(并查集)
#include #include #include #include using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define ss(x) scanf("%d",&x) const int maxn=20000+10; int d[maxn],pa[maxn]; int n; int getroot(int原创 2016-10-20 21:17:07 · 201 阅读 · 0 评论 -
UVA 1160 X-Plosives(并查集)
可以把一个化合物看成一条边,那么两端点就是化合物的两个元素,如果k个化合物,k个元素,那么代表这k条边练成了一个环,所以用并查集来判断就可以了。 #include #include #include #include using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define ss(x) scanf("%d"原创 2016-10-20 19:46:38 · 190 阅读 · 0 评论 -
UVA 12232 Exclusive-OR (带权值的并查集)
I don‘t know直接复制网站上的话一直WA,直接复制’是错的。#include #include #include #include #include using namespace std; const int maxn=40000+5; int pa[maxn],w[maxn]; int n,m,conflict; int findset(int x) { if(pa[x]==原创 2016-11-04 21:54:54 · 215 阅读 · 0 评论 -
POJ 2236 Wireless Network
这题如果命令是O的话,那么就会有一个结点被激活,那么就要查看这个结点能不能跟在距离范围内的结点相连了,那就要用一个for循环来遍历与它相邻的点,如果相邻点的距离小于d的话,那就说明可以连接,连接的判断条件为if(fix[i]&&G[u][i]// // main.cpp // Richard // // Created by 邵金杰 on 16/7/24. // Copyright © 2原创 2016-07-24 14:55:04 · 146 阅读 · 0 评论 -
POJ 1703 Find themCatch them
这类题有一点类似,那就是需要定义状态,且题目越复杂,状态越多,如果状态多,定义状态的时候要与题目给出的关系有一定联系。// // main.cpp // Richard // // Created by 邵金杰 on 16/7/24. // Copyright © 2016年 邵金杰. All rights reserved. // #include #include using na原创 2016-07-24 11:40:19 · 255 阅读 · 0 评论 -
POJ 2560 Freckles
数据太水了,所以用暴力求的距离。 // // main.cpp // Richard // // Created by 邵金杰 on 16/7/23. // Copyright © 2016年 邵金杰. All rights reserved. // #include #include #include #include using namespace std; const int原创 2016-07-24 11:18:15 · 221 阅读 · 0 评论 -
POJ 1861 Network
// // main.cpp // Richard // // Created by 邵金杰 on 16/7/23. // Copyright © 2016年 邵金杰. All rights reserved. // #include #include #include using namespace std; const int maxn=15000+100; int pa[maxn原创 2016-07-24 10:22:16 · 175 阅读 · 0 评论 -
POJ 2492 A Bug's Life
这题和1182食物链类似,不过是简化版。 设定两个状态0表示同性,1表示异性都是相对父结点而言的。那么孙子和爷爷结点的关系为(re[a]+re[pa[a]])%2; 那么两个集合相并时,根结点a和b的关系为(1+re[y]+re[x])%2; 判断是否同性时的条件时if(a==b&&re[u]==re[v]) 发现这题与食物链都有共同点,那就是要定义相互之间的状态,并且用一个类似的公式来算原创 2016-07-24 00:10:39 · 168 阅读 · 0 评论 -
POJ 2524 Ubiquitous Religions
// // main.cpp // Richard // // Created by 邵金杰 on 16/7/23. // Copyright © 2016年 邵金杰. All rights reserved. // #include #include using namespace std; const int maxn=50000+100; int pa[maxn],sum[max原创 2016-07-23 19:31:19 · 147 阅读 · 0 评论 -
POJ 1182 食物链
这题用并查集来写,且树的层数不超过2,3层最多只持续一个循环就会变成2层,因为只有三种动物,两两之间的关系只需要2层树就可以表示清楚了,那么现在当树有三层时怎么变成2层树呢? 先假设0,1,2分别为该结点与父结点表示的关系,0表示同类,1表示该结点被父结点吃,2表示该结点吃父结点。 这个表示方法是有原因的,目的是为了下面方便推公式,首先题目给出d表示关系,d==1表示同类,d==2表示y被x吃原创 2016-07-23 18:57:46 · 195 阅读 · 0 评论 -
POJ 1988 Cube Stacking
初始时每个堆就一个方块,如果碰到指令M,那么就是把x的堆放到y的堆上,那么我们把不动的堆,也就是y当作根,把x解到y上,那么x堆的根结点的under[rootx]改成 y堆的sum[rooty],因为x堆下面最起码有sum[rooty]的方块,y的每个方块的under是不用更新的,因为它没有变,而x堆的方块则需要更新,更新的方法就是如果你要知道 p下面有多少个节点时,从p开始去寻找根结点,然后原创 2016-07-23 15:12:04 · 201 阅读 · 0 评论 -
UVA 11987 Almost Union-Find(有删除操作的并查集)
因为有删除操作,那么可能删除的是根节点,所以定一个虚拟节点,结合中的元素全部接到虚拟节点下。#include #include #include #include using namespace std; typedef long long LL; const int maxn=200000+10; int pa[maxn],num[maxn]; LL sum[maxn]; int findpa(原创 2016-11-02 17:40:41 · 186 阅读 · 0 评论