您的位置:首页 > 其它

HDU 1232 并查集问题

2012-10-05 15:05 169 查看
#include <iostream>
#include <memory.h>
using namespace std;

#define N 1010
int set
; //定义并查集大小
int height
; //定义每个集合树的高度
void set_height_init() //初始化并查集,每个节点为一个集合
{
int i=1;
for(i=1;i<N;i++)
set[i]=i;
memset(height,1,sizeof(height));
}

//采用树形存储 查找每个集合的标识
int findx(int x)
{
int r=x;
while(set[r] != r)
r=set[r];
return r;
}
//判断a b 是否属于一个集合,
//如果不属于将集合 a , b合并
void mergeab(int a,int b)
{
//返回集合的标识,判断是否属于一个集合
int i = findx(a);
int j = findx(b);
if(i != j)
{
if(height[i] == height[j])
{
height[i] += 1;
set[j]=i;
}
else if(height[i] > height[j])
set[j] = i;
else
set[i] = j;
}
}
int main()
{
int n,m;
int a,b;
int countset,i;
while(cin>>n&&n!=0)
{
//初始化
countset = 0;
set_height_init();
cin>>m;
while(m--)
{
cin>>a>>b;
mergeab(a,b); //合并集合
}

for(i=1;i<=n;i++)
if(set[i] == i)
countset++;
cout<<countset-1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  include 存储 ini