hdu 2818 Building Block(并查集)
2013-07-08 19:55
405 查看
去年暑假学并查集的时候学的不太好,当时就纯粹把并查集当作实现克鲁斯卡尔算法的一个知识点,很幼稚的认为并查集就是用来实现克鲁斯卡尔算法的。虽然后来知道这种想法很幼稚,但是并查集也确实一直是我的一个软肋。
合并集合、路径压缩都没有问题,但是我在更新under[x]的值的时候卡住了。看了下别人的代码,就是一个递归操作。不算复杂,但是我之前真心没有遇到过。
并查集还是要专门学习一下。
合并集合、路径压缩都没有问题,但是我在更新under[x]的值的时候卡住了。看了下别人的代码,就是一个递归操作。不算复杂,但是我之前真心没有遇到过。
并查集还是要专门学习一下。
#include<stdio.h> #include<string.h> #define N 300010 int mark ,rank ,under ; void Init(int x) { for(int i=0;i<=x;i++) { mark[i]=i; rank[i]=1; under[i]=0; } return ; } int Find(int x) { if(x==mark[x]) return mark[x]; int temp=Find(mark[x]); under[x]+=under[mark[x]]; mark[x]=temp; return mark[x]; } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return ; mark[x]=y; under[x]+=rank[y]; rank[y]+=rank[x]; return ; } int main() { int n; while(scanf("%d",&n)!=EOF) { getchar(); Init(n); while(n--) { char c; scanf("%c",&c); if(c=='M') { int x,y; scanf("%d%d",&x,&y); Union(x,y); } else { int x; scanf("%d",&x); Find(x); printf("%d\n",under[x]); } getchar(); } } return 0; }
相关文章推荐
- 【HDU 2818】 Building Block 【带权并查集】
- HDU 2818 Building Block (带权并查集)
- hdu 2818 Building Block(并查集,有点点复杂)
- hdu 2818 Building Block (多个权值的并查集)
- HDU 2818 Building Block(带权并查集)
- HDU 2818 Building Block【并查集+根节点偏移量】
- hdu 2818 Building Block (并查集)
- HDU 2818 Building Block 加权并查集
- hdu 2818 Building Block(并查集,输出一元素下边有多少)
- HDU 2818 Building Block【并查集+根节点偏移量】
- hdu 2818 Building Block(并查集)
- hdu 2818 Building Block(加权并查集)
- hdu 2818 Building Block (带权并查集,很优美的题目)
- HDU 2818 Building Block(带权并查集)
- hdu 2818 Building Block 并查集 路径压缩
- HDU 2818 Building Block (带权并查集)
- Hdu 2818 Building Block 加权并查集
- ?HDU 2818 Building Block 求大神讲解 (并查集)
- hdu-2818-Building Block-带权并查集
- HDU 2818 Building Block(带权并查集)