
并查集
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
BestCoder Round #73 (div.2)1002/hdoj5631
思路:判断点是否连通,祖先只有一个并查集:可以分类点,访问的是点所在的集合#include<stdio.h>#include<iostream>#include<cstdio>#include<queue>#include<queue>#include<stack>#include<cmath>#include<cstring>#include<cstdlib>#include<原创 2016-03-19 09:27:02 · 523 阅读 · 0 评论 -
HDU4424【并查集】
实在不会DFS如何维护什么东西。 这种树上操作,也可以拿拿并查集(考虑集合的特性和合并——保持最优)试试~ 思路: 对每个点集维护一个点为汇点(不维护具体标号),维护这个点集的最大权值,再维护这个点集的个数(维护这个主要是为了合并集合之用) 先对所有边权排序(降序),然后每次取一条边,边有两个点,对两个点当前所在的集合。我们先考虑两个集合合并是如何操作的,由于当前边为最小值,所以被合并的集合原创 2017-10-02 20:35:19 · 386 阅读 · 0 评论 -
SPOJ IAPCR2F 【并查集】
思路:利用并查集/DFS都可以处理连通问题。PS:注意Find()查找值和pre[]值的区别。#includeusing namespace std;const int N=1e3+10;int val[N];int pre[N],n,m;vectorxs,ans;int Find(int x){ int r=x; while(pre[r]!=r) r原创 2017-03-08 23:23:39 · 414 阅读 · 0 评论 -
HDU1829【种类并查集】
题意:检验给出条件是否有同性恋。思路:条件并查集。还是一个类似的前缀和,sum[x]是x到根这段路径上的和,根一定是坐标越小的,那么如果说对于同类(同一个集合)的判断就sum[a]是否等于sum[b]对于不同类的话,就是他们的关系取反。考虑状态压缩中,关系就是叠加。一直wa,wa在Find以后是判断各自的关系。#includeusing namespace s原创 2017-02-09 23:55:21 · 539 阅读 · 0 评论 -
HDU3038【种类并查集】
题意:给出m组区间[a,b],以及其区间的和,问有矛盾的有几组;思路:种类并查集。主要是几个关系:同类元素的关系,父亲与儿子的关系,不同类元素的关系;我们可以类似看作一个前缀和,sum[x]是x到根这段路径上的和,那么根一定是坐标越小的,那么如果说对于同类(同一个集合)的判断就是sum[b]-sum[a-1]是否等于给出值如果是不同类的话:组合,大的值归到小的去。考虑区原创 2017-02-09 21:38:25 · 489 阅读 · 0 评论 -
POJ1182【种类并查集】
题意:给出m组区间[a,b],以及其区间的和,问有矛盾的有几组;思路:---来源百度0表示它与根结点为同类,1表示它吃根结点,2表示它被根结点吃。判断两个点a, b的关系,我们令p = Find(a), q = Find(b),即p, q分别为a, b子树的根结点。1. 如果p != q,说明a, b暂时没有关系,那么关于他们的判断都是正确的,然后合并这两个子树原创 2017-02-09 20:57:19 · 359 阅读 · 0 评论 -
5-4 公路村村通 (30分)【简单的最小生成树】
5-4 公路村村通 (30分)现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道路数目MM(\le 3N≤3N);随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建原创 2016-11-24 22:54:37 · 1391 阅读 · 0 评论 -
Codeforces325 D【并查集维护连通性】
参考:大牛blog思路:因为是环,所以可以复制一下图,先判断一下和他是不是和与他相邻的8个之一的一个障碍使得构成了一个环,环就是一个连通,用并查集维护即可;如果没有就ans++,然后并把这个点加入。大致意思就是这样。#include #include #include #include #include #include #include #include us转载 2016-12-04 15:42:32 · 643 阅读 · 0 评论 -
51nod 1456【强连通,缩点,并查集】
话说这道题的机遇是看到了http://blog.youkuaiyun.com/u010885899/article/details/50611895很有意思;然后就去补了这题 题意: 建最少的边使得给出的点相连。 思路: 直观感觉,如果a->b,b->c,那么a->c就不用建了。 然后还有一种情况就是回路a->b->c->a,这样的话要有n条。 所以其实思路就是这样,弱连通的时候n个点就是+n-1条原创 2016-09-29 00:18:07 · 555 阅读 · 0 评论 -
Codeforces698B【并查集+拆环】
好题,好题,第一次写这个神秘的拆环。。 题意: 给你n个数,第i个数代表点i连向点a[i], 将这副图变成树,求最小改变边的数量; 思路: 已知有向树的定义, 除了根节点外每个节点都有且仅有一条边都指向它的父亲节点, 而根节点有且仅有一条边指向自己。 给出的图类型, 1.环; 2.独立的点; 3.链; 如果是独立的话,就是选定一个根节点然后,让其他根节点指向它; 如果存在环原创 2016-09-27 23:32:36 · 713 阅读 · 0 评论 -
2016 Multi-University Training Contest 1Abandoned country
qaq,现在内心真是各种草泥马。怪自己见识短浅。。。哎。。。 题意: 给你一幅图,然后求一个最小花费使得所有的点都连通(这就是最小生成树啊),然后在这棵树上【如果我要从任意起点到任意终点,这两个点不同,且这两个点的被选取概率都是一样,求一个最小的期望长度,我的神队友的解释就是树上所有任意不同点之间的边值都加起来然后除以边的数量】思路: ①:最小生成树; ②:求一个所有边之和/边的数量,一个边原创 2016-07-19 16:48:02 · 934 阅读 · 4 评论 -
PTA 朋友圈【并查集的合并问题】
一开始,考虑的是每次就是把第一个作为祖先,这样很明显是错误的,比如 7 4 3 1 2 3 2 4 2 3 5 6 7 1 6 所以这正是更好地体现对于集合的代表。只有把所有的元素合并一下,然后选一个作为代表代表集合,这有点感觉强连通算法。所以后来的比较好的方法,就是每个都并一下,选一个作为代表,因为并的操作是要find的,而find是要找那个boss的,所以很不错诶;#include<原创 2016-07-08 19:00:18 · 817 阅读 · 0 评论 -
poj1308【并查集】
= =、如果输入的两个数相等。就不是一颗树啊,不能自己指向自己。 水。(瞎开的数组)。//#include <bits/stdc++.h>#include<iostream>#include<cstdio>#include<math.h>#include<string.h>#include<algorithm>using namespace std;typedef long long原创 2016-07-19 09:39:34 · 555 阅读 · 0 评论 -
hdoj1272 小希的迷宫
并查集 = =、一开始判断连通,没有判断环,后来判断了环,没有判断连通。。。 还有就是一开始是0 0,也是Yes,有道理么?我不是很懂。。#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#includ原创 2016-07-04 08:27:27 · 423 阅读 · 0 评论 -
hdoj1272【并查集】
因为是第二遍,所以题目也没怎么看,然后一开始的思路就是如果每次输入两个点的时候判断是不是同一个集合,如果同一个就是No,然后就wa了,想想也是,然后瞄了一下题解,还要判连通…真是蠢死了…多个集合都想不到,然后搞好以后还是wa…这次是在想不通了…然后偷瞄了代码…草泥马只有“0,0”的时候是Yes,哎,就是漏洞百出的思路,这还是得多练啊。。。#include<cstdio>#include<queue原创 2016-05-23 19:40:36 · 471 阅读 · 0 评论 -
UVAlive6187【带权值并查集】
思路: 利用并查集是显然的。 如何处理权值,这个要想一下。对于A->B->C->D这个集合,X->Y代表X是Y的祖先,每个点有一个权值num[p] 我们把权值放在最底端,这样主要是方便合并(个人觉得)首先在同一个集合的X, Y求差值的话直接num[X] - num[Y]就好了然后合并 Ai, Bj这两个点,分别位于A,B集合,我们找到A集合的根rootA,找到B集合的根rootB,如果输入是原创 2017-10-22 19:37:19 · 428 阅读 · 0 评论