poj2524 并查集
来源:互联网 发布:linux xen 安装 编辑:程序博客网 时间:2024/04/30 00:44
如题:http://poj.org/problem?id=2524
最简单的并查集。
#include<iostream>
#include<algorithm>
using namespace std;
#define N 50001
using namespace std;
struct Node
{
int data; //数据域
int rank; //优先度(深度)
int parent; //集合标识
}node[N];
int get_parent(int x) //得到x元素所在的集合
{
if(node[x].parent==x)
return x;
else
return get_parent(node[x].parent);
}
void Union(int a,int b) //a所在的集合和b所在的集合合并
{
int fa,fb;
fa=get_parent(a);
fb=get_parent(b);
if(fa==fb)
return;
if(node[fa].rank>node[fb].rank) //将深度小的集合放在深度大的下面
{
node[fb].parent=fa;
if(node[fb].rank+1>node[fa].rank)
node[fa].rank=node[fb].rank+1;
}
else
{
node[fa].parent=fb;
if(node[fa].rank+1>node[fb].rank)
node[fb].rank=node[fa].rank+1;
}
}
int main()
{
int n,m;
int u=0;
int i;
while(1)
{
u++;
scanf("%d %d",&n,&m);
getchar();
if(!n)
break;
for(i=0;i<N;i++) //并查集初始化
{
node[i].rank=0;
node[i].parent=i;
node[i].data=0;
}
for(i=0;i<m;i++)
{
int stu1,stu2;
scanf("%d %d",&stu1,&stu2);
getchar();
Union(stu1,stu2);
}
int sum=0;
int religion[N];
int moni=0;
for(i=1;i<=n;i++)
religion[i]=get_parent(i);
sort(religion+1,religion+n);
for(i=1;i<=n;i++)
{
if(religion[i]!=moni) //去掉重复
{
moni=religion[i];
sum++;
}
}
cout<<"Case "<<u<<": "<<sum<<endl;
}
return 0;
}
- POJ2524(并查集)
- poj2524(并查集)
- POJ2524-并查集
- poj2524 并查集
- poj2524 并查集
- POJ2524(并查集)
- POJ2524->并查集
- 并查集:poj2524:
- poj2524(并查集)
- POJ2524 并查集
- POJ2524(并查集)
- POJ2524 并查集应用
- POJ2524(简单并查集)
- [c] poj2524 并查集
- poj2524并查集模板
- POJ2524 Ubiquitous Religions 并查集
- 并查集简单小习题 poj2524
- 1poj2524(套模板并查集)
- 德盛行小额贷款 可信吗?加(604300932)了解
- UVA 10878
- iOS7下隐藏status bar的详细研究
- poj2840
- 利商小额贷款 可信吗?加(604300932)了解
- poj2524 并查集
- virtualbox 打不开ubuntu解决
- poj2864
- 图解windows 下apache+php+mysql+phpmyadmin+Zend Optimizer
- cell.textLabel不为空, cell.detailTextLabel=nil.
- SIPp安装配置
- poj 2871
- hdu 3065——病毒侵袭持续中
- 【Android】Support 包里究竟有什么