POJ2524->并查集
2016-07-25 17:30
381 查看
题意:给出一些在一个集合的元素信息,求一共有多少个无交集的集合
题解:并查集,初始集合个数为人数,在合并集合的过程中,每次在一个集合里合并了一个人,集合个数就减一
#include <stdio.h>
#include <iostream>
using namespace std ;
#define MAX 50005
int parent[MAX] ;
int rank[MAX] ;
int num[MAX] ;
int cnt ;
void make_set(int x)
{
parent[x] = x ;
rank[x] = 0 ;
num[x] = 1 ;
}
int find_set(int x)//查找x的根节点
{
int r = x , temp ;
while(parent[r] != r) r = parent[r] ;
while(x != r)
{
temp = parent[x] ;
parent[x] = r ;
x = temp ;
}
return x ;
}
void union_set(int x , int y)//合并两个集合
{
x = find_set(x) ;
y = find_set(y) ;
if(x == y) return ;
if(rank[x] > rank[y])
{
parent[y] = x ;
num[x] += num[y] ;
}
else
{
parent[x] = y ;
if(rank[x] == rank[y]) rank[y] ++ ;
num[y] += num[x] ;
}
cnt -- ;
}
int main(int argc, char const *argv[])
{
int n , m , T = 1;
while(scanf("%d%d" , &n , &m)!=EOF , m+n)
{
for(int i = 0 ; i <= n ; i ++) make_set(i) ;
int a , b ;
cnt = n ;
for(int i = 1 ; i <=m ; i ++)
{
scanf("%d%d", &a , &b) ;
union_set(a , b) ;
}
printf("Case %d: %d\n", T++ , cnt);
}
return 0;
}
题解:并查集,初始集合个数为人数,在合并集合的过程中,每次在一个集合里合并了一个人,集合个数就减一
#include <stdio.h>
#include <iostream>
using namespace std ;
#define MAX 50005
int parent[MAX] ;
int rank[MAX] ;
int num[MAX] ;
int cnt ;
void make_set(int x)
{
parent[x] = x ;
rank[x] = 0 ;
num[x] = 1 ;
}
int find_set(int x)//查找x的根节点
{
int r = x , temp ;
while(parent[r] != r) r = parent[r] ;
while(x != r)
{
temp = parent[x] ;
parent[x] = r ;
x = temp ;
}
return x ;
}
void union_set(int x , int y)//合并两个集合
{
x = find_set(x) ;
y = find_set(y) ;
if(x == y) return ;
if(rank[x] > rank[y])
{
parent[y] = x ;
num[x] += num[y] ;
}
else
{
parent[x] = y ;
if(rank[x] == rank[y]) rank[y] ++ ;
num[y] += num[x] ;
}
cnt -- ;
}
int main(int argc, char const *argv[])
{
int n , m , T = 1;
while(scanf("%d%d" , &n , &m)!=EOF , m+n)
{
for(int i = 0 ; i <= n ; i ++) make_set(i) ;
int a , b ;
cnt = n ;
for(int i = 1 ; i <=m ; i ++)
{
scanf("%d%d", &a , &b) ;
union_set(a , b) ;
}
printf("Case %d: %d\n", T++ , cnt);
}
return 0;
}
相关文章推荐
- 搭建opencv for Android环境的亲身经历问题
- ASP.NET MVC Bootstrap极速开发框架
- Android音视频测试之Android CTS Media API Test
- 嵌入式学习--step4 STM32F4总线架构
- 异或与Tire 树 小总结
- Java线程工作内存与主内存变量交换过程及volatile关键字理解
- 观察者模式
- [转]GoEasy实现web实时推送过程中的自动补发功能
- dalvik VM的解释器分析
- QT之文件对话框
- 隐马尔科夫模型(HMMs)之三:隐马尔科夫模型
- oracle创建表副本
- linux
- iOS中UIWebView的使用详解
- oracle不能导出空的表
- PHP工程师面试常见问题
- spark MetaException(message:Version information not found in metastore. )
- C语言 goto void extern sizeof enum typedef分析
- mysql 行列转换
- Python方法完成农历日历功能代码