Cod sursa(job #1831440)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 18 decembrie 2016 03:29:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
// Union-Find - Disjoint Sets - O(N + M lg*N)
#include <fstream>
using namespace std;

ifstream is("disjoint.in");
ofstream os("disjoint.out");

const int MAX_N = 100001;
const int MAX_M = 100001;

int Find(int node);
void Union(int firstNode, int secondNode);
void Init(int n);


int weight[MAX_N], root[MAX_N];

int main()
{
    int n, m;
    is >> n >> m;
    Init(n);

    for (int index = 0, op, firstNode, secondNode; index < m; ++index)
    {
        is >> op >> firstNode >> secondNode;
        switch (op)
        {
            case 1:
                Union(firstNode, secondNode);
                break;
            case 2:
                os << (Find(firstNode) == Find(secondNode) ? "DA" : "NU") << '\n';
                break;
        }
    }

    return 0;
}

void Union(int firstNode, int secondNode)
{
    int x = Find(firstNode);
    int y = Find(secondNode);
    if (weight[x] > weight[y])
        root[y] = x;
    else
    {
        root[x] = y;
        if (weight[x] == weight[y])
            weight[x]++;
    }
}

int Find(int node)
{
    if (node != root[node])
        root[node] = Find(root[node]);
    return root[node];
}

void Init(int n)
{
    for (int i = 0; i < n; ++i)
    {
        root[i] = i; 
        weight[i] = 0;
    }
}