Cod sursa(job #2693105)

Utilizator MateGMGozner Mate MateGM Data 4 ianuarie 2021 19:58:09
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

ifstream be("disjoint.in");
ofstream ki("disjoint.out");

int findset(int i,vector<int>&parent)
{
    if(i==parent[i])
        return i;
    else{
        int root=findset(parent[i],parent);
        parent[i]=root;
        return root;
    }
}

void unionset(int x,int y,vector<int>&parent,vector<int>&rank)
{
    int rx=findset(x,parent);
    int ry=findset(y,parent);
    if(rank[rx]<rank[ry])
    {
        parent[rx]=ry;
    }
    else if(rank[rx]==rank[ry])
    {
        rank[ry]++;
        parent[rx]=ry;
    }
    else parent[ry]=rx;
}

int main()
{
    int n,m;
    be>>n>>m;
    vector<int>parent(n+1);
    vector<int>rank(n+1,0);
    for(int i=1;i<=n;i++)
        parent[i]=i;
    for(int i=0;i<m;i++)
    {
        int x;
        be>>x;
        int a,b;
        be>>a>>b;
        if(x==1)
        {
            unionset(a,b,parent,rank);
            unionset(findset(a,parent),findset(b,parent),parent,rank);
        }
        else
        {

            if(findset(a,parent)==findset(b,parent))
                ki<<"DA"<<endl;
            else ki<<"NU"<<endl;
        }
    }
    return 0;
}