
并查集
文章平均质量分 61
yuanba_xs
分享程序员的体会与知识
展开
-
hdu4496
/*input n,m,已知有n个城市,有m条道路.outputm行,第i行对应删去输入的前i行之后,城市的连通度。思路:从输入的m条边倒着数,若删完,结果应为n。从下往上,添加边,若两点不在一个集合中,结果--;注意:题目没说是一组还是多组用例,这就很尴尬了。经测验是多组用例。。。。还有注意数组越界问题,题目n,m范围,以及城市编号是从0到n-1*/#include原创 2017-02-06 18:07:31 · 344 阅读 · 0 评论 -
poj2524并查集模板
/*并查集模板*/#include #include #include #define N 50005int n, m;int f[N];void init()//初始化{ for (int k = 1; k <= n; k++) f[k] = k; return;}int find(int x)//寻根{ if (f[x] == x) return x;原创 2017-02-02 23:33:29 · 193 阅读 · 0 评论 -
并查集总结
并查集模板void init()//初始化{ for (int i = 1; i f[i] = i;}int find(int x)//路径压缩,寻根{ return x == f[x] ? x : f[x] = find(f[x]);}void merge(int x, int y)//合并两个元素所在集合{ int t1 = find(x),原创 2017-02-18 16:33:12 · 304 阅读 · 0 评论 -
poj1988 带权并查集
带权并查集的应用题意: 说是有n块砖,编号从1到n,有两种操作,第一是把含有x编号的那一堆砖放到含有编号y的那一堆砖的上面,第二是查询编号为x的砖的下面有多少块砖。思路:带权并查集,用dis[i]表示元素i下边有多少个元素,num[i]表示元素i所在堆的砖块总数或者说dis[i]:当前元素到树根的距离num[i]:当前元素所在树的大小(即树中元素个数)Sample In原创 2017-02-18 16:29:42 · 215 阅读 · 0 评论 -
poj1838 并查集 抽象模型
题意:一个点用坐标(x,y)表示,如果两个点在水平方向或垂直方向上相邻,则两个点属于一个区域,即点1(x1,y1),点2(x2,y2)相邻当且仅当x1==x2,|y1-y2|=1或者|x1-x2|=1,y1=y2。给定一些点,相邻的点构成一个区域,求出k个区域所能拥有的最大点数(k不大于区域数)Input第一行两个整数n和k分别代表点数和区域数,之后n行为n个点的坐标Out原创 2017-02-18 14:08:57 · 378 阅读 · 0 评论 -
poj2236并查集简单应用
并查集的基本应用题目:输入电脑个数n,(电脑标号为1到n)相邻电脑交流的最大距离d。输入n台电脑的坐标。起初n台电脑均被破坏。两台电脑之间可通过第三台电脑相互交流。下边有两种输入:O i。修复第i台电脑S a b 判断电脑a和b是否能交流,若能输出SUCCESS,否则输出FAIL。思路:用并查集处理。输入遇到O:标记当前电脑已修复,找出已修复的其他所有电脑看是否能合原创 2017-02-18 14:04:54 · 288 阅读 · 0 评论 -
poj2492种类并查集
种类并查集的应用题意:有n只bug,下边给出m对关系,每对关系都表示他们能相互交配,判断其中是否有同性恋。思路:典型种类并查集,一共有两类:男女。对于每只bug,创建两个元素:i-A,i-B。并用2*n个元素的并查集维护。1.i-x表示i属于种类x2.并查集里到达每一个组表示组内所有元素代表的情况都同时发生或者不发生 输入的u,v如果是同一性别(下边维护的两种情况,因此此处原创 2017-02-18 14:03:44 · 330 阅读 · 0 评论 -
poj1703 种类并查集
种类并查集的应用定义并查集为:并查集里的元素i-x表示i属于帮派x同一个并查集的元素同时成立可见所有元素个数为2 * N,如果i表示属于帮派A,那么i + N表示属于帮派B,每次输入两个家伙不在同一帮派的时候,就合并他们分属两个帮派的元素。输入量比较大,要用scanf,用cin会超时#include #define N 100005int f[2 * N];in原创 2017-02-18 14:02:31 · 245 阅读 · 0 评论 -
poj1611并查集求元素所在集合的元素总数
并查集应用:求某元素所在集合的元素个数题目:已知有n个人,m个团队,已知0号选手有病毒,病毒会传染给他所在任一小组中的人。求最后有病毒的人的个数。思路1:对相同团队的人进行合并,最后输出与0在同一集合的元素个数。即是否满足find(0)==find(i)。思路2:对相同团队的人进行合并,合并过程中对集合元素个数num也和并,最后找到0的祖先的num即可思路1:#incl原创 2017-02-18 13:59:43 · 586 阅读 · 0 评论 -
poj1308 判断是否为树
题目:已知有m条边连接顶点,判断其是否为一棵树思路:树的条件:要么是空树,要么满足连通无环1.无环(可通过并查集判断)2.连通(不能出现森林,即所有输入的点必须只在一个集合里边)自己wa了好几遍。总结下来有几个原因:1.空树特判2.输入问题,无论是不是树,都必须输入完数据才行。3.初始化一定要放在最前边4.连通无环是并列关系,但是只要一个不满足,在输入完成的原创 2017-02-18 13:54:51 · 451 阅读 · 0 评论 -
poj1182食物链 种类并查集
种类并查集1.定义:rank为0代表父节点与子节点是同一物种,rank为1代表父节点吃子节点,rank为2代表子节点吃父节点。这个定义与输入的type相符合,type-1==1表示x吃y,type-1==0表示同一物种2.路径压缩:儿子对爷爷的关系==(儿子对父亲的关系+父亲对爷爷的关系)%3。可通过穷举法证明。3.集合合并:以左为尊处理f【】数组,rank数组的值根据两次使用路径原创 2017-02-18 13:51:17 · 351 阅读 · 0 评论 -
hdu4496 D-City 判断两元素是否在同一集合
Luxer is a really bad guy. He destroys everything he met. One day Luxer went to D-city. D-city has N D-points and M D-lines. Each D-line connects exactly two D-points. Luxer will destroy all the D-l原创 2017-02-18 13:45:04 · 351 阅读 · 0 评论 -
hdu1232 畅通工程 并查集版题
#include #include #define N 1005using namespace std;int n, m;int f[N];void init(){ for (int i = 1; i <= n; i++) f[i] = i;}int find(int x){ return x == f[x] ? x : f[x] = find(f[x]);}原创 2017-02-18 13:43:06 · 257 阅读 · 0 评论 -
hdu1598 求满足最大权值最小权值差最小的生成树
/*题意:已知一张图,给定起点终点,求出包含起点和终点的生成树:使得生成树的最大边权与最小边权之差最小,并输出其值。若不连通,输出-1*//*思路:先对边按权值排序。然后从最小的边开始枚举至最大边,然后枚举比当前边大的所有边,直到出现满足条件的生成树为止,此时更新ans。*/#include #include #include #include #define N 205原创 2017-02-04 11:48:34 · 789 阅读 · 0 评论