![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
进修中的涵涵涵
acm退役选手
acm icpc 金
dota爱好者
展开
-
HDU - 3081 Marriage Match II(最大流+并查集+二分查找)
点击查看原题 题目大意:一个(很恶俗的)交友游戏,男女搭配,女生选男生,选择的规则是可以选自己认可的也可以选自己的朋友(朋友的朋友,朋友的朋友的朋友)认可的。每轮可以选一个,并且下轮不能选已经被自己选过的。问最多可以玩几轮。 分析(建图): 因为一个团体可以选团体内任何人认可的人匹配,所以先并查集把团体分类,然后让内部每个女生都可以选团体可以选的男生,流量为1。 因为玩的轮数最多为n所以二分原创 2017-01-13 13:56:23 · 440 阅读 · 0 评论 -
POJ-2236 Wireless Network(并查集深度优化模板题)
点击查看原题 题目大意:有n台电脑,电脑最大联机距离为d,给出每个电脑的坐标,进行多个操作,O p操作修复p号电脑,S p,q操作 询问p号电脑和q号电脑是否可以连接。 分析: 因为时间给了10s所以是并查集模板题。 这里使用了深度优化让rank小的拼接到rank大的上面。#include<stdio.h> #include<string.h> #include<queue> #includ原创 2017-01-13 14:57:22 · 433 阅读 · 0 评论 -
POJ-1611 The Suspects (并查集模板题)
点击查看原题 这也是一道试模板的题 题目大意:有一种传染病,默认一个团体内有一个患病者就全部认为患病,0号默认患病,问有多少患病人员。 没什么好说的直接上模板#include<stdio.h> #include<string.h> int father[30050]; int rank1[30050]; int n,m; void init() { for(int i=0;i<=n;i原创 2017-01-13 16:24:41 · 502 阅读 · 0 评论 -
POJ-1213 How Many Tables (并查集模板题)
点击查看原题 题目大意:一堆人开派对,只有认识的人才能坐一桌,问至少要几桌 并查集把认识的人链接起来,然后查找父亲一共有几个输出就是需要的桌子数量 AC代码#include<stdio.h> #include<map> #include<string.h> using namespace std; int father[10000]; int rank1[10000]; void init(i原创 2017-01-13 16:47:24 · 403 阅读 · 0 评论 -
带权并查集思路
例题地址 FF和TT玩游戏,TT想一串数,FF询问其中一个区间的和,TT给出答案,但是TT可能会给出错误的回答,问有几处错误。 分析:对于带权的并查集问题,我们需要一个value数组,value[i]代表着i到自己祖先的权值,所以在我们更新father组的时候也要同时更新value数组。 当合并祖先的时候 i到新祖先的权值就等于 i到旧祖先的权值加上旧祖先到新祖先的权值 val原创 2017-01-14 21:25:29 · 1064 阅读 · 0 评论 -
POJ 1182 食物链(带权并查集)
食物链 Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 66682Accepted: 19660 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用原创 2017-01-17 15:08:57 · 347 阅读 · 0 评论 -
poj 1733 Parity game(离散化+带权并查集+二分查找)
Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8355 Accepted: 3248 Description Now and then you play the following game with your friend. Your f原创 2017-01-22 23:16:45 · 556 阅读 · 0 评论 -
带权并查集(模板)
int father[500000]; int rank1[500000]; int value[500000]; void init(int n) { for(int i=0;i<=n;i++) { father[i]=i; rank1[i]=0; value[i]=0; } } int find(int a) { if(a==father[a]) return a;原创 2017-06-20 21:15:57 · 384 阅读 · 0 评论