并查集 - 图论基础

2017-07-25 22:18:16

writer:pprp

定义:(来源于搜狗百科)并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。

作用:用来判断两个节点是否属于同一颗树;

操作:1,查找,Find

      2,合并,Merge

#include <iostream>

using namespace std;

int parent[1000];

int Find(int x)
{
    if(parent[x] == x)
        return x;
    else
        return parent[x] = Find(parent[x]);
}

void Merge(int a,int b)
{
    int pa = Find(a);
    int pb = Find(b);
    if(pb < pa)
        swap(pb,pa);
    if(pa!=pb)
        parent[pa] = pb;
}

int main()
{
    int n, m,cnt;
    while(cin >> n)
    {
        for(int i = 1; i <= n ; i++)
            parent[i] = i;
        cin >> m;

        while(m--)
        {
            int x, y;
            cin >> x >> y;
            Merge(x, y);
        }
        cnt = -1;
        for(int i = 1; i <= n; i++)
            if(parent[i] == i)
                cnt++;
        cout << cnt <<endl;
    }
    return 0;
}

 

posted @ 2017-07-25 22:49  pprp  阅读(261)  评论(0编辑  收藏  举报