并查集

来源:互联网 发布:ios wkwebview 传值js 编辑:程序博客网 时间:2024/04/30 13:03

[简介]

在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。在数据量过大时,只能用并查集来描述。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集的相关介绍参见并查集详解。
其核心函数如下:

#define MAX 100000int pre[MAX];       //记录当前节点的父节点int find(int x){    //查找跟节点    if(x != pre[x])        pre[x] = find(pre[x]);        //压缩路径    return pre[x];}void combine(int x, int y){ //合并集合    int a = find(x);    int b = find(y);    if(a != b)        pre[a] = b;}

hdu-1232题目并查集实现如下:

#include <iostream>#include <stdio.h>using namespace std;#define MAX 5000000int pre[MAX];void init(int N){    for(int i=1; i<=N; i++)        pre[i] = i;}int find(int x){    if(x != pre[x])        pre[x] = find(pre[x]);    return pre[x];}void combine(int x, int y){    int a = find(x);    int b = find(y);    if(a != b)        pre[a] = b;}int main(){    int N,M,a,b;    freopen("in.txt","r",stdin);    while(scanf("%d%d",&N,&M) && N!=0){        int num=-1;        init(N);        for(int i=0; i<M; i++){            scanf("%d%d",&a,&b);            combine(a,b);        }        for(int i=1; i<=N; i++){            if(pre[i] == i)                num++;        }        cout<<num<<endl;    }    return 0;} 
0 0
原创粉丝点击