POJ1988基本的并查集

来源:互联网 发布:知不足,然后能自反也 编辑:程序博客网 时间:2024/04/29 09:06
#include <iostream>#include <cstdio>using namespace std;static const int MAX = 31000;static int par[MAX];static int  sum[MAX];//砖块i所在堆的砖块数目static int under[MAX];//表示i下面有多少个砖块static int GetParent(int a){if (par[a]==a) return a;int t = GetParent(par[a]);under[a] +=under[par[a]];//路径压缩后更新par[a] = t;return par[a];}static void Merge(int a,int b){int n;int pa = GetParent(a);int pb = GetParent(b);if (pa==pb) return;par[pb] = pa;under[pb] = sum[pa];//under[pb] 赋值前一定是0,因为parent[pb] = pb,pb一定是原b所在堆最底下的sum[pa] +=sum[pb];//根引出来的有多少个结点}int main(){int p;for (int i=0;i<MAX;++i){sum[i] = 1;under[i] = 0;par[i] = i;}scanf("%d",&p);for (int i=0;i<p;++i){char s[20];int a,b;scanf("%s",s);if (s[0]=='M'){scanf("%d%d",&a,&b);Merge(b,a);}else{scanf("%d",&a);GetParent(a);printf("%d\n",under[a]);}}return 0;}

0 0
原创粉丝点击