数据结构-并查集
文章平均质量分 80
iHge2k
专注数据结构和算法
展开
-
Codeforces Round#250 D. The Child and Zoo(并差集)
题目链接:http://codeforces.com/problemset/problem/437/D 思路:bing'cha 原创 2014-06-05 22:24:06 · 723 阅读 · 0 评论 -
并查集小结
并查集一类的题目最近也做了许多,相对来说,还是比较容易理解和实现的。 最早开始接触并查集是在学习用kruskal求最小生成树的时候,后来接触的题目多了,发现并查集还有好多用途,比如典型的判环,区间问题等等。学习并查集的过程中我发现,并查集的路径压缩十分重要,有时候对于题目限定的条件,在路径压缩的过程中常常伴随着节点信息的更新。 有一类带权并查集的题目,往往还要开多个数组来记录节点的信息,而这些原创 2014-05-26 18:01:45 · 304 阅读 · 0 评论 -
hdu 4424
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4424题意:给你一颗树,树中每条边有一权值c,对于从i节点到j节点的路径,其权值定义为该路径上边权值的最小值,于是问找到一个中心点,使得从该点到其他节点的路径权值和最大,求该最大值。 思路;要使得权值和最大,容易想到对边进行从大到小排序,用一个sum来记录权值,cnt来记录节点个数,然后每次合并时取权原创 2014-05-26 18:01:43 · 414 阅读 · 0 评论 -
hdu 3047(带权并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3047 思路:冲突的条件是:两个人坐在同一行,同时他们到根节点的差值等于他们之间的差值,这时就产生冲突了。于是我们可以用一个dist数组来保存节点到根的距离,而这个距离在路径压缩的时候更新一下就可以了,dist[x]+=dist[parent[x]]。然后就是合并后的距离,令r1=Find(u),r2原创 2014-05-26 18:01:34 · 401 阅读 · 0 评论 -
hdu 2144(LCS+并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2144 思路:合并的过程中多了一个条件,而这个条件的判断可以通过求最长公共连续子序列得到,别的和普通的并查集没什么区别,最后就是简单地判断一下集合的个数即可。 1 #include 2 #include 3 #include 4 #include 5 using names原创 2014-05-26 18:01:30 · 329 阅读 · 0 评论 -
hdu 2120(并查集判环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2120 思路:简单的并查集判环应用,即如果当前的两个节点在同一个集合中,那么说明存在环了,ans++。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 1原创 2014-05-26 18:01:22 · 344 阅读 · 0 评论 -
hdu 3938(离线的并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3938 思路:对于边进行从小到大进行排序,题目要求a、b两点之间所有的路径中的最大边的最小值,在满足边的大小=len的,都要加上原先的路径数目。 1 #include 2 #include 3 #include 4 #include 5 using namespace st原创 2014-05-26 18:01:24 · 319 阅读 · 0 评论 -
hdu 3277(最大流+二分+并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3277 思路:3081差不多,就是多了每个女孩可以另外选任意k个不喜欢的,将每个女孩u分为u1,u2,若u喜欢v则加一条u1到v的边 否则加一条u2到v的边,令加u1到u2的容量为k的边; 然后不知道为什么,wa了一下午,哎。。。 以下是wa代码,不知道哪儿有bug. View Code原创 2014-05-26 17:57:39 · 472 阅读 · 0 评论 -
hdu 1598 第一道并查集
虽然在学数据结构的时候看过并查集。。。好像是在Kruskal算法中讲到了,不过做题中用到这还是头一次。。。哎,acm有太多的第一次了。。。不过生命不休,学习不止。。。 好吧。。。不多说了。。。 View Code 1 #include 2 #include 3 const int N=1010; 4 const int inf=1000000; 5 using nam原创 2014-05-26 17:51:11 · 354 阅读 · 0 评论 -
hdu 1232 经典并查集应用
http://acm.hdu.edu.cn/showproblem.php?pid=1232 完全就是并查集的应用啊。。。 View Code 1 #include 2 const int N=1010; 3 using namespace std; 4 5 int n,m; 6 int parent[N]; 7 8 //初始化 9 void UF原创 2014-05-26 17:51:32 · 292 阅读 · 0 评论 -
hdu 3081(二分+最大流+并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 思路设源点为0,汇点为2*n+1,对没吵过架的女生和男生连容量为1的边(这里要用到并查集,每个女生的朋友也可以和该男生连边),然后就是源点与女生连边,容量为mid(0http://blog.csdn.net/qq564690377/article/details/7857983),然后就是二分原创 2014-05-26 17:57:37 · 328 阅读 · 0 评论 -
poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径上的点进行标记,于是根据题意我们可以发现,如果这个图是“caterpillar”的话,那么他所有的边要么两端都在树上最长直径上,要么就是其中一端在,于是我们可以再次dfs进行判断就可以了。原创 2014-05-26 18:04:47 · 686 阅读 · 0 评论 -
hdu 4496(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4496、 思路:简单并查集应用,从后往前算就可以了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 10100 7 #define MAXM 100原创 2014-05-26 18:06:36 · 339 阅读 · 0 评论 -
hdu 4514(并查集判环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Tencent昨天比赛的题目,昨天看的时候没什么思路,今天在网上搜了一下,说是可以用并查集做。。。果然,过了。。。看来还是做的题不够多啊!!! 思路:并查集判环,并把每次的边权值都加到根结点的上去,最后求每个根结点权值的最大值就行了。。。orz View Code 1 #incl原创 2014-05-26 17:54:02 · 489 阅读 · 0 评论 -
并查集中的合并、删除操作
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2155 思路:在一般的并查集操作中设立虚父亲节点,当删除x的时候,不是真的删除x,而是通过一个映射,即令tmp[x] = cnt, parent[cnt] = cnt;这样x就从原来的集合中独立出来了,而我们每次合并x,y的时候,只需合并tmp[x], tmp[y]就可以了。 1 #include原创 2014-05-26 18:10:07 · 415 阅读 · 0 评论 -
hdu 2818(带权并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818 思路:Count[i]表示i下面的积木个数,路径压缩的时候更新一下即可,sum[i]表示以i为根的积木的个数。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #defin原创 2014-05-26 18:01:36 · 363 阅读 · 0 评论 -
hdu 2860(并查集应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2860 思路:多了一个记录每个集合最小值的value数组而已,然后判断的时候小心一点就可以了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 10000原创 2014-05-26 18:01:28 · 519 阅读 · 0 评论 -
hdu 1558(线段相交+并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 思路:主要是判断线段相交,如果相交,就是要合并了,并且修改一下sum值就可以了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define原创 2014-05-26 18:01:32 · 408 阅读 · 0 评论 -
hdu 1181(并查集+拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 思路:先处理‘=‘,全部合并为同一个节点,然后在拓扑排序就可以了。。。 拓扑排序知识: *如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一*如果排序的总个数小于给定的个数,则说明存在回路 View Code 1 #define _CRT_SECURE_NO_WARNIN原创 2014-05-26 17:56:20 · 363 阅读 · 0 评论 -
poj 1733(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 思路:这题一看就想到要用并查集做了,不过一看数据这么大,感觉有点棘手,其实,我们仔细一想可以发现,我们需要记录的是出现过的节点到根节点的1个奇偶性,这与区间端点的大小并没有关系,于是想到我们可以用map映射即可,这样就解决了大数据了。此外,如果0表示出现偶数个1,1表示出现奇数个1,然后就是向量偏移关系了(http://ww原创 2014-05-26 18:02:10 · 381 阅读 · 0 评论 -
pku 1182(种类并查集)
题目链接:http://poj.org/problem?id=1182 解题思路来自discuss:http://poj.org/showmessage?message_id=152847 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 50050 6 int paren原创 2014-05-26 18:02:06 · 341 阅读 · 0 评论 -
pku 1703(种类并查集)
题目链接:http://poj.org/problem?id=1703 思路;个人觉得本质上还是和带权并查集一样的,只不过多了一个MOD操作,然后就是向量关系图稍微改动一下就变成种类并查集了,对于本题,我们可以用一个kind数组来表示是否属于同一类,其中kind[x]==0表示不是同一类,kind[x]==1表示属于同一类,这样我们就可以得到向量关系式了(若r1=Find(u),r2=Find(原创 2014-05-26 18:02:04 · 433 阅读 · 0 评论 -
hdu 1116(并查集+欧拉路判断)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1116 思路:先合并,然后判断根结点是否唯一,如果是,则在判断是否是欧拉路;否则,直接结束。 View Code 1 #include 2 #include 3 #include 4 using namespace std; 5 const int MAXN=100000+原创 2014-05-26 17:56:18 · 357 阅读 · 0 评论 -
hdu 2545(并查集求节点到根节点的距离)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 思路:dist[u]表示节点u到根节点的距离,然后在查找的时候更新即可,最后判断dist[u],dist[v]的大小即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namesp原创 2014-05-26 18:07:27 · 486 阅读 · 0 评论 -
hdu 1829+hdu 1856(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829 思路:就是同性别的合并在一个集合中,然后每次输入看u,v是否在同一个集合中。。。然后不知道为什么用路径压缩不可以写。。。一些就TLE了。。。无语了。。。orz。。。 View Code 1 #define _CRT_SECURE_NO_WARNINGS 2 #include原创 2014-05-26 17:56:22 · 438 阅读 · 0 评论