HDU 2818&&POJ 1988 并查集简单应用
因为并查集是递归找根节点是自下向上的 ,可以通过找根节点的过程中更新low值
所以以箱子的底部为根节点
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; #define N 500000+5 #define IN freopen("in.txt","r",stdin) int fa[N],have[N],low[N];// void init(int n) { for(int i=0; i<=n; i++){ fa[i]=i; have[i]=1; low[i]=0; } } int find(int x) { if(fa[x]==x) return x; else { int f=fa[x]; fa[x]=find(fa[x]); low[x]+=low[f];//更新操作 return fa[x]; } } void merge(int x,int y) { int fx=find(x),fy=find(y); if(fx==fy)// return ; fa[fx]=fy; low[fx]+=have[fy];//因为是X堆放在Y堆上,所以X堆的底部要加上Y堆所有的箱子个数 have[fy]+=have[fx];//因为X,Y都已经是同一个父亲只需要更新父亲节点的have值 } int main(){ int p; //IN; scanf("%d",&p); init(30000);//初始化 char c[2]; int a,b; while(p--){ scanf("%s",c); if(c[0]=='M'){ scanf("%d%d",&a,&b); merge(a,b); } else { scanf("%d",&a); find(a);//查询前需要更新 printf("%d\n",low[a]); } } return 0; }