您的位置:首页 > 其它

HDU 2818&&POJ 1988 并查集简单应用

2014-07-19 16:32 381 查看
 因为并查集是递归找根节点是自下向上的 ,可以通过找根节点的过程中更新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
,have
,low
;//
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: