数据结构:并查集
skajre
这个作者很懒,什么都没留下…
展开
-
POJ 1611 The Suspects
#include#include#include#includeusing 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 · 161 阅读 · 0 评论 -
UVA 1329 Corporative Network(并查集)
#include#include#include#includeusing 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 · 188 阅读 · 0 评论 -
UVA 1160 X-Plosives(并查集)
可以把一个化合物看成一条边,那么两端点就是化合物的两个元素,如果k个化合物,k个元素,那么代表这k条边练成了一个环,所以用并查集来判断就可以了。#include#include#include#includeusing 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 · 183 阅读 · 0 评论 -
UVA 12232 Exclusive-OR (带权值的并查集)
I don‘t know直接复制网站上的话一直WA,直接复制’是错的。#include#include#include#include#includeusing 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 · 205 阅读 · 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 · 141 阅读 · 0 评论 -
POJ 1703 Find themCatch them
这类题有一点类似,那就是需要定义状态,且题目越复杂,状态越多,如果状态多,定义状态的时候要与题目给出的关系有一定联系。//// main.cpp// Richard//// Created by 邵金杰 on 16/7/24.// Copyright © 2016年 邵金杰. All rights reserved.//#include#includeusing na原创 2016-07-24 11:40:19 · 246 阅读 · 0 评论 -
POJ 2560 Freckles
数据太水了,所以用暴力求的距离。//// main.cpp// Richard//// Created by 邵金杰 on 16/7/23.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#includeusing namespace std;const int原创 2016-07-24 11:18:15 · 216 阅读 · 0 评论 -
POJ 1861 Network
//// main.cpp// Richard//// Created by 邵金杰 on 16/7/23.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#includeusing namespace std;const int maxn=15000+100;int pa[maxn原创 2016-07-24 10:22:16 · 168 阅读 · 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 · 154 阅读 · 0 评论 -
POJ 2524 Ubiquitous Religions
//// main.cpp// Richard//// Created by 邵金杰 on 16/7/23.// Copyright © 2016年 邵金杰. All rights reserved.//#include#includeusing namespace std;const int maxn=50000+100;int pa[maxn],sum[max原创 2016-07-23 19:31:19 · 139 阅读 · 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 · 169 阅读 · 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 · 191 阅读 · 0 评论 -
UVA 11987 Almost Union-Find(有删除操作的并查集)
因为有删除操作,那么可能删除的是根节点,所以定一个虚拟节点,结合中的元素全部接到虚拟节点下。#include#include#include#includeusing 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 · 182 阅读 · 0 评论