![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
月光下的魔术师
这个作者很懒,什么都没留下…
展开
-
hihocoder 1066 并查集
hihocoder 1066题解:并查集裸题#include <bits/stdc++.h>using namespace std;int const N = 100000 + 10;int n,k,fa[N];string s1,s2;map<string,int>mp;int find(int x){ return (x == fa[x]) ? ...原创 2019-02-10 12:50:49 · 99 阅读 · 0 评论 -
uva1151:最小生成树+状态枚举
uva1151题意:被题目和图给吓到了,直接上这一题很简单。就是让所有城市都连通,有两种方案,一种是两个点之间修一条边,价格为两点距离的平方。另一种方案是买一个套餐,套餐里的城市都连通。求最下的花费。题解:二进制状态压缩,枚举套餐,然后再并查集找最小生成树。和HDU1102很像,已经构造的边就合并,让后再查找剩下的。一次AC,很舒服~~代码:#include <cstrin...原创 2019-02-13 12:58:01 · 163 阅读 · 0 评论 -
hihocoder1307:几何计算+并查集
hihocoder1301题解:一堆相交圆放在一个集合里,如果它的高>=h,底<=0,那么就不能穿越错误代码:我也不知道为什么不能AC??#include <cstring>#include <algorithm>#include <iostream>#include <cmath>using namespace s...原创 2019-02-11 14:23:58 · 95 阅读 · 0 评论 -
HDU3635:带权并查集
HDU3635题解:找城市编号和总数比较简单,难点在于怎么统计转移次数。每次转移在根节点加一,每次find子节点的根时,根节点转移次数下放,相当于一个lazy标记下放过程,然后使子节点指向根节点。代码:#include <bits/stdc++.h>using namespace std;int const N = 10000 + 10;int T,n,q,su...原创 2019-02-11 13:36:58 · 152 阅读 · 0 评论 -
poj1733
poj1733题解:数据太大需要离散化,一道并查集的简单题代码:#include <vector>#include <iostream>#include <algorithm>#include <cstdio>using namespace std;int const N = 10000 + 10;int n,k,fa[N]...原创 2019-02-11 13:11:31 · 142 阅读 · 0 评论 -
HDU6109:并查集+set
HDU6109题意:开始题目看来半天每看懂。。。i,j表示某个数的编号,题目给你约束条件,以i,j为编号的数相等(e=1)或者不相等(e=0)。将这么多约束条件按顺序分组。每一组满足约束条件矛盾,但是去掉最后一组就不矛盾了。求共有几组和每组的数量。就是这样~喵题解:不知不觉~迷迷糊糊~就一次AC了首先用并查集来维护。1、如果之前两个数在一个集合里面(fx = fy),就表示...原创 2019-02-11 12:29:24 · 186 阅读 · 0 评论 -
zoj3261:倒序并查集
zoj3261题解:建议大家先做一下HDU4496,也是倒序并查集找最大值和最大编号其实也比较简单,代码里Union有,大家应该能看懂。其它都是一些细节上的处理代码:#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include ...原创 2019-02-11 11:56:21 · 333 阅读 · 0 评论 -
HDU1272:带权并查集
HDU1272题解:判断是否构成一棵树,可以用DFS也可以用并查集,这里用并查集做DFS做法可以参考我的博客hihocoder 1322注意一开始就输入0 0的情况为空树,也是Yes代码:#include <bits/stdc++.h>using namespace std;int const N = 100000 + 10;int fa[N],vis[N]...原创 2019-02-10 20:35:11 · 148 阅读 · 0 评论 -
poj1984:带权并查集
poj1984题解:让你求两个点之间的哈密顿距离。可以分别维护横坐标和纵坐标的前缀和。代码:#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace st...原创 2019-02-10 20:06:58 · 124 阅读 · 0 评论 -
poj1182:带权并查集
poj1182经典题目题解:对于k,x,yk=0,1,2分别表示同类,x吃y,x被y吃如果x吃y,y吃z,则z吃x,所以k分别为1,1,2如果x被y吃,y被z吃,则x吃z,k分别为2,2,1如果x和y同类,y吃z,则x吃z,k分别为0,1,1如果x和y同类,y被z吃,则x被z吃,k分别为0,2,2我们发现(k1 + k2) % 3 = k3代码:#include ...原创 2019-02-10 20:04:58 · 114 阅读 · 0 评论 -
poj2492:带权并查集
poj2492题意:实验给出:同性虫子不交流,异性交流。给出虫子的交流情况,判断是否符合实验。题解:对话用1表示(异性),不对话用0表示(同性)x和y对话,y和z对话,则x和z不能对话,分别为1,1,0x和y对话,y和z不对话,则x和z对话,分别为1,0,1x和y不对话,y和z不对话,则x和z不对啊,分别为0,0,0所以k3 = (k1 + k2)% 2代码:#i...原创 2019-02-10 20:02:57 · 179 阅读 · 0 评论 -
HDU4496:带权并查集
HDU4496题意:每次去掉一条边,求去掉前k条边后,连通分量的个数题解:总共有m条边,去掉前k条边之后的连通分量的个数,即为后(m-k)条边所构成的连通分量的个数。所以我们从后往前插入边,每次记录连通分量的个数即可。#include <bits/stdc++.h>using namespace std;typedef pair<int,int>p...原创 2019-02-10 13:15:49 · 127 阅读 · 0 评论 -
hdu3047带权并查集
hdu3047题解:带权并查集裸题#include <bits/stdc++.h>using namespace std;int const N = 50000 + 10;int n,m,a,b,x,f[N],val[N];int find(int x){ if(x != f[x]){ int t = f[x]; f[x] = find(f[x]); v...原创 2019-02-10 13:12:04 · 180 阅读 · 0 评论 -
hihocoder1515:带权并查集
题解:带权并查集建议大家先学习一下HDU3038,其它的都一样。代码如下#include <bits/stdc++.h>using namespace std;int const N = 100000 + 10;int n,m,q,fa[N],val[N];void Init(){ for(int i=0;i<=n;i++) fa[i] = i,val[i] ...原创 2019-02-10 13:09:07 · 148 阅读 · 0 评论 -
HDU3038:带权并查集
HDU3038题解:带权并查集简单的说,就是fx = fa[x],fy = fa[y],那么sum[x]即为区间[fx,x]的和,sum[y]即为区间[fy,y]的和如果fx == fy,即左端点相同,我们就要判断sum[y]-sum[x]是否等于题目给的区间和如果不相同,就要使fa[fy] = fx,此时sum[fy] = sum[y]+s-sum[x](三段区间的关系,大家自己...原创 2019-02-10 13:03:44 · 170 阅读 · 0 评论 -
HDU1102:并查集+最小生成树(Kruskal)
HDU1102题解:已经有了的边就合并,然后剩下的边求最小生成树即可。代码:#include <bits/stdc++.h>using namespace std;int const N = 200 + 10;int const M = 10000 + 10;int n,m,q,a[N][N],fa[N];struct Edge{ int u,v,dist;...原创 2019-02-13 13:00:59 · 146 阅读 · 0 评论