树的等价问题,并查集
2016-05-24 20:56
232 查看
问题 F 算法6-8~6-11:用树表示的等价问题
时间限制: 1 Sec 内存限制: 128 MB[提交]
题目描述
在离散数学中,对等价关系和等价类的定义是:如果集合S中的关系R是自反的、对称的和传递的,则称它为一个等价关系。
等价关系是现实世界中广泛存在的一种关系,许多应用问题可以归结至等价类问题,这类问题通常被称为等价问题。
通过使用集合,能够解决等价问题。而集合可以通过双亲表示法的树结构进行保存。通过对树结构的操作,可以实现查找、归并等操作。查找操作和归并操作的算法如下:
在以上的归并操作中,由于表示集合的树的深度与树形成的过程有关,因此在最坏情况下全部归并操作将会有O(n2)的复杂度。而通过在归并时比较子集所含成员的数目,令成员少的归并至成员多的集合,将能够提高算法的效率。下面给出优化的归并操作算法:
另外,通过增加“压缩路径”的功能,即将所有从根到相应元素路径上的元素都变成树根的孩子。算法如下所示:
本题中,将会给出n个原本互不相交的集合及k次集合合并的操作。通过这k次合并,判断最终的某两个原始的集合是否被合并成了同一个集合。
输入
输入的第一行包含两个用空格隔开的正整数n和k,其中n不超过100,k不超过n-1。 之后的k行中,每行包含两个用空格隔开的正整数x和y,表示将x元素所在的集合和y元素所在的集合合并至同一个集合。保证x和y均在1至n之间。 最后一行中,包含两个正整数,表示需要判断是否在同一个集合的元素编号。
输出
共一行,包含字符串“YES”或“NO”,“YES”表示需判断的元素在同一个集合中,“NO”表示不在同一个集合中。请注意不需要输出引号,且行尾输出换行。
样例输入
5 21 32 31 2
样例输出
YES#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
typedef struct{
int data;
int parent;
int lchild;
int rchild;
}tree;
int n,k;
tree tr[101];
int find(tree tr[],int i){
int j;
if(i<1||i>n) return -1;
for(j=i;tr[j].parent>0;j=tr[j].parent);
return j;
}
int main(){
while(~scanf("%d %d",&n,&k)){
int i,j;
for(i=1;i<=n;i++){
tr[i].data=i;
tr[i].parent=-1;
}
int x,y;
int root1,root2;
for(i=0;i<k;i++){
scanf("%d %d",&x,&y);
for(j=0;j<101;j++){
if(tr[j].data==x){
root1=find(tr,j);
//printf("%d\n",root1);
}
if(tr[j].data==y){
root2=find(tr,j);
//printf("%d\n",root2);
}
}
tr[root2].parent=root1;
}
int num1,num2;
scanf("%d %d",&num1,&num2);
root1=find (tr,num1);
root2=find(tr,num2);
if(root1==root2)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)