题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1272
并查集:用来查找元素所在的集合和合并2个不同的集合,如果用上启发式合并和路径压缩的话,能够进一步优化其效率。一般用森林表示法,即同一个集合的元素属于一颗树,其根节点为该集合的代表元素。
启发式合并:即把深度小得树合并到深度大的树上去。
路径压缩:每次查找完一个元素,都把该查找路径上得元素的父指针指向该集合的代表元素。
#include<iostream>
using namespace std;
const int SIZE = 100010;
int p[SIZE];
bool vis[SIZE];
bool input();
void init();//初始化并查集
int Find(int x);
bool Union(int x,int y);
int main()
{
//freopen("datain.txt","r",stdin);
//freopen("dataout.txt","w",stdout);
while(input());
return 0;
}
bool input()
{
int a,b,cnt=0;
bool ok = true;
init();
while(cin>>a>>b,a||b)
{
if(a==-1&&b==-1)return false;
//还要判断是否只有一个集合
if(!vis[a])
{
cnt++;
vis[a] = 1;
}
if(!vis[b])
{
cnt++;
vis[b] = 1;
}
//判断集合内部是否有环
if(!Union(a,b))ok = false;
else{cnt--;}
}
if(ok&&(!cnt||cnt==1)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return true;
}
void init()
{
for(int i=0;i<SIZE;i++)
p[i] = i;
memset(vis,0,sizeof(vis));
}
int Find(int x)
{
return x==p[x]?x:Find(p[x]);
}
bool Union(int x,int y)
{
int px = Find(x);
int py = Find(y);
if(px==py)return false;
p[px] = py;
return true;
}
- 大小: 6.2 KB
分享到:
相关推荐
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复...
数据结构 并查集 查询 快速 实用 ACM
并查集 第12章 并查集
并查集模板并查集模板并查集模板并查集模板并查集模板并查集模板
深入理解并查集算法,细致讲解,专业老师,一步到位 。
学习并查集的好东东,需要的看看吧,ACM之路
并查集讲义,清楚明白地讲解并查集原理及优化
并查集详解
并查集,acm,并查集的入门课件,主要使用与ACM学习
C++版并查集的课件,定义,并查集的精髓代码以及路径压缩的内容
C++整理\并查集\并查集初步.ppt 并查集初步
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一...即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。
并查集的简介,用法,以及一些例子
算法与数据结构:并查集实现的方法,以及ACM并查集的一些例子
并查集原理和代码实现。或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们...
关于并查集的几道经典题目,希望对大家有所帮助
并查集的一些基础知识讲解,详细的PPT,希望对搜索者有帮助!
最经典并查集详细讲解, 最经典并查集详细讲解。
使用C++实现了并查集的建立,合并和查找功能,并附简单的测试用例。