并查集
2020100XWH
这个作者很懒,什么都没留下…
展开
-
la3027
并查集路径压缩动态记录唯一父节点边权,更新与根结点的距离 #include<bits/stdc++.h> using namespace std; const int maxn=50000; int pa[maxn],d[maxn],n; void init() { for(int i=1;i<=n;++i) pa[i]=i,d[i]=0; } int findset(int x) { if(pa[x]!=x) { int roo原创 2022-01-27 18:02:07 · 323 阅读 · 0 评论 -
la3644
辨别k个化合物(都含两个元素)有k个元素,把放入化合物当作连边操作,要求拒绝元素与化合物个数相等的情况,环(包括重边)的特征就是边的个数与点的个数相等,而唯一操作就是连边,所以就用并查集查询新连边是否属于一个集合,若属于一个,则记录,反之加入集合(集合即为联通)当元素为已存在的点 火车头也有弊端 #include<bits/stdc++.h> using namespace std; const int maxn=100010; int pa[maxn]; void init() {原创 2022-01-27 18:03:32 · 431 阅读 · 0 评论 -
并查集优化之爆栈
优化的并查集虽在查询是会明显提高效率但在处理时有额外负担容易爆栈 !!! int findset(int x) { int r=x; while(pa[r]!=r) r=pa[r]; int i=x,j; while(i!=r) { j=pa[i]; pa[i]=r; i=j; } return r; } void union1(int x,int y) { x=findset(x); y=findset(y); if(h[x]==h[y]) { h[x]原创 2021-08-30 15:11:45 · 113 阅读 · 0 评论 -
hdu1182经典题食物链
通过加n来进行多区间映射 注意输入输入加速 还有初始化问题 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 129576 Accepted: 39597 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行.原创 2021-07-30 22:55:43 · 63 阅读 · 0 评论 -
HUD1988路径合并 路径压缩
若是仅仅为集合关系问题 为了快速访问可以直接路径压缩 而当需要路径长度时(有先后关系)则需要在压缩路径的同时标记路径长度 即此处的dis 而路径长度与当前被并入路径的整个长度和并入路径的长度有关 前者通过son数列完成并且通过每次加入维护更新新加入的根部的son 后者则通过在find_set函数中通过不断更新根节点来更新维护,根节点dis为0,当根节点更新,恰好更新距离,而单链上的距离恰是子节点加一,即通过son和dis互相维护,fa本为父节点,更新后即路径压缩后成根节点 #include<原创 2021-07-30 16:19:46 · 40 阅读 · 0 评论 -
并查集板子及并查集处理存储不同集合的方法
#include<iostream> #include<string> #include<math.h> using namespace std; int a[200005]; int h[200005]; int n,m; void init_set() { for(int i=1;i<=2*n;++i) { a[i]=i; h[i]=0; } } int find_set(int x) { if(x!=a[x]) a[x]=find_set(.原创 2021-07-30 09:43:18 · 51 阅读 · 0 评论