POJ1988 并查集(3)
2016-12-10 17:48
309 查看
1 题意
2 分析
在Find()函数中,如果利用递归来更新相关信息,那么一定要注意递归基的使用,如本题更新node[x].under_number 总是利用 node[old].under_number,而node[old].under_number在上一层递归里会被更新,注意当old==root时的情况。
3
2 分析
在Find()函数中,如果利用递归来更新相关信息,那么一定要注意递归基的使用,如本题更新node[x].under_number 总是利用 node[old].under_number,而node[old].under_number在上一层递归里会被更新,注意当old==root时的情况。
3
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int maxn=3e4+10; struct Node{ int all_number; int under_number; int parent;//s.t. bottom }node[maxn]; void Ini(){ for(int i=1;i<maxn;i++){ node[i].parent=i; node[i].all_number=1; node[i].under_number=0; } } int Find(int x){ if(node[x].parent==x) return x; else{ int old=node[x].parent; node[x].parent=Find(old); node[x].under_number+=node[old].under_number; return node[x].parent; } } void Join(int p1,int p2){ node[p1].parent=p2; node[p1].under_number=node[p2].all_number; node[p2].all_number+=node[p1].all_number; } int main(){ int p,n1,n2,p1,p2; char com[2]; while(~scanf("%d",&p)){ Ini(); for(int i=1;i<=p;i++){ scanf("%s",com); if(com[0]=='M'){ scanf("%d%d",&n1,&n2); p1=Find(n1); p2=Find(n2); if(p1!=p2) Join(p1,p2); } else if(com[0]=='C'){ scanf("%d",&n1); n2=Find(n1); cout<<node[n1].under_number<<endl; } } } }
相关文章推荐
- 【POJ 1988】 Cube Stacking (带权并查集)
- POJ 1988 带偏移量的并查集
- 题解 并查集 POJ 1988
- POJ 1988 Cube Stacking【并查集的简单应用 堆木块】
- POJ 1988 Cube Stacking(并查集)
- poj 1182 1988 并查集
- POJ 1988 Cube Stacking(带权并查集)
- POJ 1988 Cube Stacking (并查集,节点到根节点的距离题目)
- 【POJ1988】Cube Stacking(并查集)
- POJ 1988 带偏移量的并查集
- poj 1988 Cube Stacking(数据结构:带权并查集)
- POJ 1988 Cube Stacking(路径压缩并查集)
- POJ 1988 Cube Stacking 并查集
- poj 1988 Cube Stacking(加权并查集 )
- poj 1988 Cube Stacking (并查集)
- POJ 1988 Cube Stacking(带权并查集)
- POJ 1988 Cube Stacking (带权并查集)
- POJ1988 CubeStacking (并查集)
- POJ-1988 Cube Stacking (并查集)
- poj1988_并查集