并查集
文章平均质量分 68
爱抠脚的coder
这个作者很懒,什么都没留下…
展开
-
并查集(1)梳理
并查集是数据结构中用来表示集合信息的,用以实现确定某个集合含有哪些元素、判断哪些元素属于一个集合,并且求集合中元素的数量等问题。一般我们对集合的操作是通过查找根节点的方法来实现,一般是不断的查找双亲节点直到双亲节点不存在的节点为止,这个节点就是根节点,这个过程的耗费与树高是成正相关的,在进行合并树的时候,如果只是仅仅合并而不采取任何的措施会使得树高不断的增加,查找根节点的耗时也会不断的增加,极端情原创 2017-09-22 19:44:09 · 263 阅读 · 0 评论 -
并查集的使用(4):head of a gang
题目网址:head of a gang需要注意这一题,与之前那些并查集的题目相比难度增大很多,需要考虑的因素增多。题目大意:给定n和k,n组通话(通话双方的name和通话时间),我们需要做的是找出属于一个团体的人,并且这个团体的人数必须大于2,且团体的总的通话时间需要大于k,要求输出最终满足条件的gang的boss的name和这个gang的人数!(按照字母序输出)分析:(1)首先使原创 2017-09-24 09:52:59 · 398 阅读 · 0 评论 -
jungle roads
题目网址:jungle roads题目大意:指的是给你一个图,让你给出将所有节点相连接起来的最小的花销,花销与边权值是相对应的,最终输出最小的结果。这个输入是比其他稍微复杂点,给n表示村庄的数目,接下来n-1行,第一个字符是起点,第二个数字是表示与这个起点相邻的节点的个数,然后是相邻节点的字符和距离;就是采用并查集来做,最小生成树的kruskal算法,直接给出源代码了。。#includ原创 2017-09-24 15:55:37 · 396 阅读 · 0 评论 -
Freckles
题目网址:Freckles题目大意:给出n个点的坐标,求出将这些点相连,这种连接方式使得所有线段长度和最小,求这个长度和为多少?其实这道题,比最小生成树的求解多了一个步骤,因为给的是一系列的点,并不像之前的题目给的是一系列的边,我只需要将边权值排序然后kruskal就行,这道题我需要利用一个结构体存储那些输入的点,然后在求解。#include#include#include#in原创 2017-09-24 15:23:27 · 264 阅读 · 0 评论 -
畅通工程
题目网址:畅通工程题目比较简单,与之前的还是畅通工程相比就是多了判断是否可以构成最小代价生成树,即使用一个cnt,判断是否parent[i]==i的数目大于1,那么就是存在节点不在最小生成树上。直接给出源码:/*题目描述: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估, 得到的统计表中列出了有可原创 2017-09-24 16:32:28 · 309 阅读 · 0 评论 -
还是畅通工程(Kruskal)
题目网址:还是畅通工程原理:(并查集和最小生成树思想的结合)(1)初始时所有的节点都属于孤立的集合;(2)按照边权值递增的顺序遍历所有的边,若遍历到的边两个顶点仍分属于不同的集合,则确定该边为最小生成树上的一条边,并将这两个顶点所在的集合合并;(3)遍历完所有的边,原图上所有的结点都属于同一个集合则被选取的边和原图中所有的结点构成了最小生成树;否则原图不连通,最小生成树不存在。原创 2017-09-24 10:29:14 · 511 阅读 · 0 评论 -
并查集的使用(3):连通图
题目描述:连通图题目分析:给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。就是判断是否全部属于一个集合当中!#includeusing namespace std;int parent[1001];int sum[1001];int findroot(int x){ if (parent[x] != x) parent[x] = findroot(parent[原创 2017-09-23 10:09:47 · 307 阅读 · 0 评论 -
并查集使用(2):more is better
题目网址:more is better题目分析:这个题目大致是说,有10000000个朋友,他们之中有N对好朋友,且朋友之间具有传递性,再给出N对朋友关系之后,找出最多的人数的集合,并输出最大的人数!其实就是之前在我的博客并查集梳理(1)里面merge函数中添加一步,为每个集合统计集合元素的数目,事先为每一个元素定义一个sum数组,初始化都是1(表示根节点自身)每一次需要合并都需要sum想加!原创 2017-09-23 09:33:59 · 335 阅读 · 0 评论 -
并查集的使用(1)
题目网址:畅通工程题目分析:抽象成在一个图查找连通分量(彼此相连的节点的集合)的个数,求出个数之后-1,就是我们需要的答案。#includeusing namespace std;int parent[1001];int findroot1(int x){//不带路径压缩的递归查找双亲节点的根节点 if (parent[x] == x) return x; else r原创 2017-09-23 09:14:42 · 197 阅读 · 0 评论 -
继续畅通工程
题目网址:继续畅通工程题目分析:这个比之前的还是畅通工程相比多了一个就是有的路已经修好了,无需在花销,所以我们比之前的做法只是多判断一点,如果已经修过了,那么我们就把这条路的花销修改为0,其他不变。#include#includeusing namespace std;int parent[102];int findroot(int x){ if (parent[x] != x)原创 2017-09-24 16:39:20 · 463 阅读 · 0 评论