Cod sursa(job #376674)

Utilizator alexandru92alexandru alexandru92 Data 22 decembrie 2009 12:13:29
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on December 22, 2009, 11:29 AM
 */
#include <vector>
#include <fstream>

/*
 * 
 */
using namespace std;
vector<unsigned int> rank, father;
inline unsigned int find( unsigned int x ) //path compresion
{
    if( x == father[x] )
        return x;
    else {
            father[x]=find( father[x] );
            return father[x];
         }
}
inline void Union( int x, int y ) //rank union
{
    if( rank[x] == rank[y] )
    {
         if( x != y )
             father[y]=x;
        ++rank[y];
    }
    else rank[x]=rank[y]=min( rank[x], rank[y] );;
}
int main()
{unsigned int n, t, x, y, op, i;
    ifstream in("disjoint.in");
    in>>n>>t;
    father.resize(n);
    rank.resize(n);
    for( i=0; i < n; ++i, father[i]=i );
    ofstream out("disjoint.out");
    for( i=0; i < t; ++i )
    {
        in>>op>>x>>y;
        if( 1 == op )
        {
            Union( find(x), find(y) );
            continue;
        }
        if( find(x) == find(y) )
            out<<"DA\n";
        else out<<"NU\n";
    }
    return 0;
}