并查集
Dan__ge
Today is difficult,tomorrow is more difficult,but the day after is beautiful.
展开
-
HDU 4514并查集判环+最长路
点击打开链接题意:中文题......思路:先判断能否成环,之前以为是有向图,就用了spfa判断,果断过不了自己出的样例,发现是无向图,并查集把,两个点有公共的父节点,那就是成环了,之后便是求最长路了,之前用spfa将权值取反后求最短路,然后结果取正就完事了,只是加个源点0而已,跑一边竟然能超时,难道是姿势不对吗.....,然后用了更暴力的bfs,因为是一个无环的图,所以从一个点出发后,它能原创 2016-04-06 13:05:06 · 2010 阅读 · 0 评论 -
coderforces 455C 并查集+树的直径
点击打开链接题意:有两种操作,1是问有u的最长路径的长度,2是将u与v的两个集合合并,但是要使得合并后的集合的最长路径最小思路:因为后面的操作才会改变路径长度,可以先将所有长度预处理出来,在一个集合的元素最长路径相同,然后再执行询问操作,就是这个预处理真的是醉了,就是两次BFS求出最大值,但是很有可能超时,因为如果两个点在一个集合,就要走150000次,然后再判断到每个点的最大值,原创 2016-05-28 19:16:12 · 3153 阅读 · 0 评论 -
UVALive 6091 并查集简单应用
点击打开链接题意:问你给出的图中有多少颗树,树的定义与最小生成树类似,不能有重边或者环思路:直接用并查集统计一下当前集合里的边的数量以及点的数量,如果点的数量与边的数量相等,那么是一颗树,统计完即可,水题~~~#include #include #include #include #include using namespace std;typedef long long ll原创 2016-05-28 20:22:35 · 3222 阅读 · 0 评论 -
UVALive 4730 线段树+并查集
点击打开链接题意:在坐标上给n个点,r的操作是将两个点连起来,l的操作是问你y=u的这条线连接的集合块数和这些集合内的点的个数思路:很麻烦的一道题,在网上看了题意和做法后,开始了一下午的调bug过程,做法很好懂,我开了两个线段树,一个维护点代表的直线的集合个数,另一个则是路过集合内的点的个数,然后集合的判断直接用并查集就行了,这是两个核心,然后就是自己瞎写的了,代码丑的可以而且好像除了原创 2016-05-29 19:52:07 · 3301 阅读 · 0 评论 -
HDU 3047 带权并查集
点击打开链接题意:给了n个人和m个关系,关系为a,b,x,意思是b的位置大于a的位置x,问条件依次下去的矛盾的条件的个数思路:第一个带权的并查集,倒不是很难,它的算法思想非常给力,若两个不再同一集合的两个人,将b的根节点的父亲设为a的根节点,也就是合并,而所有的点到根的距离全部是用找根节点的路上完成更新的,而现在还需要的是b的根节点的位置,它的位置应该为r[bb]=r[a]+x-r[b],原创 2016-05-18 21:10:05 · 3342 阅读 · 0 评论 -
Google Spaceship Defence 面试题目 并查集+最短路
点击打开链接题意:给了n个地点,然后每个地点的名称,若名称相同则可以认为这两个地点距离为0,下面m个关系代表两个地点的距离,有向的边,q个询问,两个点的距离,想做的密码是nefu思路:简单的最短路题目,因为有相同的点,可以用并查集将这些点放到一个集合中,然后建图建的就是父节点就行了,找相同关系我用的Trie树,但是map应该也可以直接做,没用过map只能写Trie树了,剩下的就是最短路模版原创 2016-06-02 10:40:16 · 1042 阅读 · 0 评论 -
HDU 3560 并查集
点击打开链接题意:给一个无向图,问共有多少联通块然后问这些联通块中有几个是形成一个环的,也就是每个点的度都为2思路:判断联通块直接简单的并查集就行了,然后对于每个联通块就算一下里面的所有点的度是不是2就行了,只要有一个不是2的这个联通块就不是环PS: 开头初始化时若用memset就会超时#include #include #include #include #include u原创 2016-06-26 20:29:46 · 1921 阅读 · 0 评论 -
HDU 5361 最短路变形
点击打开链接题意:给了n个点排成一行,每两个距离为1,然后对于每个点来说它有个L和R,意思是距离在L到R中间的所有点它都能到达,费用是C,问从小出发的单源所有的点的距离思路:看了网上神犇的题解有了点思路,因为每个点出去的费用都是相同的,而且费用的值大于0,那么1点直接到达的所有点的最短路就不需要在更新了,因为剩下的肯定是比它大的,那么对于这些个点我们压入队列,但是注意我们这里的dis设定为原创 2016-07-07 20:05:12 · 1919 阅读 · 1 评论 -
HDU 3849 双联通+Trie树+并查集
点击打开链接题意:给了n个人和m个关系,然后找出所有的桥并输出思路:简单的找桥就行了,然后人的编号就可以用Trie树来完成,最后坑点如果图不连通输出0,联通性用并查集就行了#include #include #include #include #include #include using namespace std;typedef long long ll;typedef原创 2016-07-29 19:24:14 · 445 阅读 · 0 评论 -
Gym 100703J 并查集
点击打开链接题意:给了n个人,m对朋友关系,和p个询问,然后接下来的第一行是第二个人到最后一个人参加游戏的最大时间,下面p个是每个游戏的持续时间,然后底下的是m对关系,一个人参加游戏的最大时间若小于游戏的持续时间,则这个人离开关系图,也就是他以后不能传递关系了,只有有关系的人才可以参加游戏思路:对于每个人我们可以先处理出他可以参加到哪个游戏,也就是什么时候离开关系图,然后不会离开的所有人都原创 2016-09-15 20:10:47 · 360 阅读 · 0 评论 -
ZOJ 3811 dfs&并查集
点击打开链接题意:给n个城镇,有的城镇会发光,给出发光的城镇,然后下面有一个人走的发光的城镇的顺序,每个城镇只会发一次光,问这个人按这个顺序是否合法并且所有的城镇都被访问到思路:可以用dfs去搜索,第一个点进去,不能走的点标记一下,然后第二个发光的城镇,判断目前标记的点中有没有,有的话说明现在可以走第二个点,以此类推,最后判断城镇是否全被访问过,一会试试并查集的方法#include #i原创 2016-05-28 14:32:17 · 727 阅读 · 0 评论 -
ZOJ 3789 并查集
点击打开链接题意:只说那几个操作把,L将u与v连接,若u左旋,则v右旋,不会出现不合法的条件,Q问u与v的关系,若已知的条件不能判断在则Unknown,旋转方向不一样则Different,一样则Same,然后还有个查询S,问当前u所在的集合的元素个数,D则为删除,但删除后不改变集合其它元素的关系思路:这题的方向我们可以用到根节点距离来表示,而距离的统计可以直接在路径压缩时完成,元素个数原创 2016-05-26 20:15:49 · 3579 阅读 · 0 评论 -
POJ 3228 网络流+二分&并查集
点击打开链接题意:有n个城镇,第一行是金矿和金子数量,然后第二行是装金子的地方和能装的数量,在下面是m条道路,问你选择的道路中最大值最小,使得所有金子运到装金子的地方思路:最大值最小,根本不用考虑一看就是二分,然后想了想就是个网络流的模型嘛,很简单,被坑了几次道路是双向的,改过之后A掉,然后看了看讨论还可以用并查集写,这里两种方法都写了,先是网络流的直接二分最大值,然后满足条件的边建模型,原创 2016-05-28 12:26:11 · 3237 阅读 · 0 评论 -
HDU 5652 图论之并查集
点击打开链接题意:上边是中国,下边是印度,黑点的部分不可以走,下面的矩阵1代表黑点不能走,然后给了Q,每一次将一个点变成黑点,即不能走,问最少多少次就可以完成思路:如果有一条黑点连成的线,从走到右的说明我们达成了目的,那就好办了,每一个黑点可以与周围的8个黑点相连,这样我们在最左边建个汇点最右边建个源点,每次询问这两个点在不在一个集合就行了,用并查集轻松实现,只要两个点相连就放到一个集合里原创 2016-03-27 16:38:41 · 785 阅读 · 0 评论 -
HDU 1863 并查集+Kruskal
点击打开链接题意:不解释了思路:也不解释了,并查集判段连通性,Kruskal求最小生成树,大水题(/ □ \)#include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x原创 2016-05-25 19:34:17 · 3195 阅读 · 0 评论 -
HDU 4496 并查集
点击打开链接题意:给了一个图,问你依次将边删除后,图还剩下多少个联通的块思路:就是问你有多少个块嘛,可以用并查集来判断是不是在一个块内,然后我们将顺序反过来判断一下就可以了,水题~~~#include #include #include #include #include using namespace std;typedef long long ll;typedef原创 2016-05-25 19:56:49 · 3138 阅读 · 0 评论 -
HDU 4313 并查集
点击打开链接题意:给一个城镇的图,有m个城镇上是有敌兵的,为了将所有敌兵的联系隔断,需要删除的所有边的最小的权值思路:看了就知道是并查集Kruskal思想的题,我们将边的权值从大到小向里面加,如果我要加的这条变加进去之后,敌兵可以相连,那么这条边肯定要删下去,而我们从大到小加的边,所以肯定是最小的,因为可以的边我们都用上了嘛#include #include #include原创 2016-05-12 19:46:09 · 3444 阅读 · 0 评论 -
HDU 2874 LCA转RMQ+并查集
点击打开链接题意:问两个城市是否相连,不相连输出Not connected,否则输出两个城市间的最短距离思路:用并查集判断两个城市的连通性,如果联通则做法和LCA一样,但是注意的一点是地图不连通的话,我们要将所有点都建起来,就要加一个模拟的点,将所有图串起来,很好处理的,看一下就会了#include #include #include #include #include #inc原创 2016-05-02 20:25:59 · 3941 阅读 · 0 评论 -
HDU 3635 并查集
点击打开链接题意:有n个村庄,初始每个村庄有一个龙珠,然后T是将A中的所有龙珠转到B所在的村庄中,然后Q是问A编号的龙珠所在的位置,这个位置的龙珠数量,和A移动的次数思路:用并查集的路径压缩来完成每个龙珠的转换次数,剩下的两个操作直接用简单的并查集即可完成,而路径压缩也就等价于这个点在走到现在位置所走的路径,那么路径压缩时直接将路过的值加起来就是结果了,画图可以很快看出来他的思想的#inc原创 2016-05-26 18:34:17 · 3328 阅读 · 0 评论 -
HDU 3172 并查集+trie树
点击打开链接题意:给n个关系,然后问u与v的集合中元素的个数思路:就是简单的并查集就行了,只是这个给的字符串比较猥琐,我们用trie树查找就行了,操作还是很简单的,然后注意的是出题人竟然设置了多组,还要多组输入,只能感叹,WA了两次,org~~~#include #include #include #include #include using namespace std;ty原创 2016-05-27 13:18:09 · 759 阅读 · 0 评论 -
HDU 2473 并查集
点击打开链接题意:给了两种操作,M u v将u与v连接到一起,S u 将u从它的集合中拿出来,但是不改变集合中的其他元素已有的关系思路:就是直接并查集,然后有了个删点的操作,这与之前写的ZOJ 3789的删除操作是一样的,找个数组代替就可以了,简单~~~ PS:加了路径压缩跑得还是那么慢,org#include #include #include #include #includ原创 2016-05-27 13:57:04 · 675 阅读 · 0 评论 -
HDU 4424 并查集
点击打开链接题意:给n个城镇,然后每两个城镇的价值给出,但是u->v的价值是u->v这条路径上的最小值,问从任意一个点出发到其他位置的和的最大值思路:因为限制条件是路径上的最小值,那么我们按价值排序,从大到小排,就可以避免这个问题了,然后利用并查集来完成,对于两个集合,左集合的价值总和为A,右集合的价值总和为B,现在有一条路径连接这两个集合,那么我们考虑的是将A合并到B还是将B合并到A,我原创 2016-05-27 17:37:18 · 3046 阅读 · 0 评论 -
51nod 1525 并查集
点击打开链接题意:中文思路:直接并查集维护就行了,对于区间合并的我用一个数组记录和它一个集合的最远点即可#include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3原创 2016-10-26 14:25:03 · 456 阅读 · 0 评论