并查集
BEconfidence
坚持才是胜利之道
展开
-
HDU1897 继续畅通工程(最小生成树Prim)
题目分析:这个题和hdu 1233差不多,就是加了一个状态,因此我们可以先判断每条路的状态,如果是修好的,就让它们的成本是0;如果没修,就让成本给出的成本。这样问题的处理就和1233一样了。#include#include#includeusing namespace std;#define inf 0x3f3f3f3fint map[100][100];int s[100],vi原创 2015-05-27 16:47:19 · 703 阅读 · 0 评论 -
并查集压缩hdu2818
#include#includeusing namespace std;int root[30010];int num1[30010];int num2[30010];int find2(int x){ if(x != root[x]) { int fx = root[x]; root[x] = find2(fx);原创 2015-07-27 14:53:39 · 859 阅读 · 0 评论 -
并查集图冲突hdu1272
还是属于并查集的变形两个点只有一条路径连通给出的两个点事先都是属于两个集合的需要给出的着条边构成一个集合算法复杂度还是挺高的每个我都循环了100000次set2数组没清空 wrong了一次#include#include#includeusing namespace std;int sett[100000 + 100];int set2[100000 + 10原创 2015-07-26 08:15:24 · 610 阅读 · 0 评论 -
并查集模板
#include#includeusing namespace std;#define MAX_N 100int par[MAX_N];int rankk[MAX_N];void init(int n){ for(int i=0;i<n;i++) { par[i]=i; rankk[i]=0; }}int find(int原创 2015-07-26 14:25:11 · 436 阅读 · 0 评论 -
第二种并查集
#include#includeusing namespace std;int Set[1000];void merge2(int a,int b){ if(a<b) Set[b]=a; else Set[a]=b;}int find2(int x){ int r=x; while(Set[r]!=r) r=Set[r]; return r;原创 2015-07-11 12:02:36 · 612 阅读 · 0 评论 -
并查集应用hdu1198
就是给并查集换了个形式判断是否能连接那我写的比较麻烦可以用四个字符表示四个方向01开关判断的时候只需要判断两个方向一开始感觉无从想法一步步顺着想有些还是会变简答的#include#includeusing namespace std;char a[51][51];int sett[2500 + 50];int find2(int x){ wh原创 2015-07-26 11:01:23 · 569 阅读 · 0 评论 -
并查集树数据结构hdu1325
我的解法就是去构造了一棵树以数组的存储方式数组的值存放节点的根!排除空树剩下的就是出现环和多根节点的情况也就是排除森林和有一个节点多个入度的情况排除森林就用到了并查集也就是便利数组让其只有一个根排除多个入度的情况更简单就是把这个点插入到数上时如果这个点已经有了根节点,就出现了两个入度#include#include#inclu原创 2015-07-26 10:00:22 · 654 阅读 · 0 评论 -
并查集应用食物链poj1182
由于N,K大需要高效的维护动物之间的关系快速判断是否产生矛盾对于每只动物创建3个元素i-A,i-B,i-C,并用这3*N个元素建立并查集!!!!!并查集里的每一个组表示组内所有元素代表的情况都同时发生或不发生!!!!!第一种,x和y属于同一种类,合并x-A和y-A,x-B,y-B,x-C和y-C第二种,x吃y。。。。。。。。。合并x-a和y-b,原创 2015-07-26 16:19:16 · 454 阅读 · 0 评论 -
并查集hdu1232
应该是最基本的题开始还是没有理解透彻没有理解透彻就不要急着做题并查集说白了就是把所有的点看看能归成几个集 合所以首先判断这两点是否在一个集合范围内如果没在一个集合范围内就把小的集合赋给大的集合记住是把小的集合赋给大的集合把小的集合赋给大的集合把小的集合赋给大的集合把小的集合赋给大的集合3遍至于为什么改成大于也对。。。#includ原创 2015-07-26 08:11:59 · 559 阅读 · 0 评论 -
第一种并查集
/**4 21 34 30 1 2 3 40 1 2 1 3*/#include#include#includeusing namespace std;int Set[1010];int M,N;void Mergel(int a,int b){ int i=min(a,b); int j=max(a,b); for(int k=1;k<=N;k+原创 2015-07-11 10:59:21 · 581 阅读 · 0 评论 -
HDU1233 还是畅通工程(并查集)
思路:考虑的是并查集,还有贪心算法中的克鲁斯卡尔算法,考虑的时候要借助 贪心算法还有并查集,建立树的概念,通过寻找父节点,看是否是满足的父节点,然后进行一些列的判断求解。#include#includeusing namespace std;struct dis{ int a,b,c;}s[10010];int cmp(dis x,dis y){ return原创 2015-05-27 14:03:26 · 902 阅读 · 0 评论 -
并查集
关系题型模板: 效率分析,注意下图中Merge函数的ab是根节点。原创 2015-05-22 22:19:54 · 432 阅读 · 0 评论 -
hdu1829 A Bug's Life(并查集)
开两个并查集,然后合并的时候要合并两次,这样在合并之前判断是否冲突,如果不冲突就进行合并,否则不需要继续合并。#include#include#include#includeusing namespace std;const int MAX=2000;int pre[2*MAX+5];bool mark;void init(int n){ int i; for(原创 2015-06-03 22:55:37 · 696 阅读 · 0 评论 -
hdu1829 A Bug's Life
#include #include #include #include #include using namespace std;const int MAX = 2000;int pre[2*MAX+5];bool mark;void init(int n){int i;////(author:CSDN:凌风)原创 2015-05-28 22:10:26 · 695 阅读 · 0 评论 -
HDU1856 More is better(并查集)
和基本的并查集相比,就是稍微改动了一下。要求的是每个集合里面人数最多的人数。就多用一个数组记录这个人数即可。#include#define N 10000000int father[N],num[N];void initial(){ int i; for(i=1;i<=N;i++) { father[i]=i; num[i原创 2015-05-27 13:29:37 · 623 阅读 · 0 评论 -
hdu1325 Is It A Tree?(并查集)
根据树的特点:要注意的问题就是:0 0 是棵树用结构体,分别记录标记、入度和根然后就分别判断:不要产生环的情况不要入度大于1的情况不要多根的情况#includeconst int max_num = 100000 + 10;typedef struct { int num,root,conn;}Node;Node node[max_num];void原创 2015-05-27 12:59:35 · 626 阅读 · 0 评论 -
HDU1875 还是畅通工程
与之前的畅通工程类似,求最小生成树,只是要剔除不符合条件的边,还要判断是否是连通图(这个磨蹭了很长时间,只要判断加入集合的点数与题目给出的点数是否相等即可)。#include#include#include#includeusing namespace std;#define NUM 103struct point{ int x; int y;}pos[NUM]原创 2015-05-27 14:25:16 · 687 阅读 · 0 评论 -
最小生成树hdu1233
这个题今天一写就搞对了我只能说以后一定要少看题解要自己深入的去想只要是把思路想明白了代码还是容易敲出来的此题就是最小生成树按照先练权值最小的边的算法当然他们不会都在一个集合内那就用一下并查集把连好的两个点并到一个集合里最后他们应该就都属于一个集合了#include#include#includeusing namespace s原创 2015-07-28 10:07:45 · 775 阅读 · 0 评论