并查集-----好忧伤的并查集

Posted 菜菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集-----好忧伤的并查集相关的知识,希望对你有一定的参考价值。

 

主要还是看find的join俩个操作,测试数据

1
6
1 2
4 3
1 3
5 6
6 1
7 1

#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

/**
 * 并查集判断有几个联通子图
 */
const int maxN = 20;
int a[maxN];
int find(int key);
void join(int s, int e);
void _init();
int main()
{
    freopen("d:\\3.txt", "r", stdin);
    int c;
    cin >> c;
    int cc = c;
    while (c--)
    {
        cout << "case:" << cc - c << endl;
        int n;
        int s, e;
        cin >> n;
        int maxNode = -1;
        int node[maxN];
        memset(node, 0, sizeof(node));
        _init();
        for (int i = 0; i < n; i++)
        {
            cin >> s >> e;
            node[s] = 1;
            node[e] = 1;
            maxNode = maxNode > s ? maxNode : s;
            maxNode = maxNode > e ? maxNode : e;
            join(s, e);
        }
        int head[maxN];
        int maxP = -1;
        memset(head, 0, sizeof(head));
        int total = 0;
        for (int i = 0; i <= maxNode; i++)
        {
            if (!node[i])
                continue;
            int p = find(i);
            maxP = maxP > p ? maxP : p;
            head[p] = 1;
        }
        for (int i = 0; i <= maxP; i++)
        {
            if (head[i] == 0)
                continue;
            total++;
            cout << "map" << total << " = ";
            for (int j = 0; j <= maxNode; j++)
            {
                if (!node[i])
                    continue;
                int p = find(j);
                if (p == i)
                {
                    cout << " " << j;
                }
            }
            cout << endl;
        }
        cout << "total map=" << total << endl << endl;
    }
    return 0;
}

int find(int key)
{
    return key == a[key] ? key : a[key] = find(a[key]);
}
void join(int s, int e)
{
    int p1 = find(s);
    int p2 = find(e);
    if (p1 != p2)
    {
        if (p1 >= p2)
            a[p1] = p2;
        else
            a[p2] = p1;
    }
}

void _init()
{
    for (int i = 0; i < maxN; i++)
        a[i] = i;
}

有错请评论

以上是关于并查集-----好忧伤的并查集的主要内容,如果未能解决你的问题,请参考以下文章

带偏移量的并查集

并查集学习

关于并查集的一切全在这里了

UVALive 6910 Cutting Tree(并查集应用)

并查集

The Suspects (并查集)