Cod sursa(job #376468)

Utilizator alexandru92alexandru alexandru92 Data 21 decembrie 2009 18:21:29
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on December 21, 2009, 4:13 PM
 */
#include <fstream>
#include <cstdlib>
#define Nmax 111111

/*
 * 
 */
using namespace std;
struct vertex
{
    int info;
    vertex* next;
} **First, **Last;
typedef vertex* list;
inline void push( list& f, int x )
{
    list q=new vertex;
    q->info=x;
    q->next=f;
    f=q;
}
bool find( list f1, list f2, int x, int y )
{
    for( ; f1->next || f2->next;  )
    {
        if( f1->next )
            f1=f1->next;
        if( f2->next )
            f2=f2->next;
    }
    return f1 == f2;

}
int main()
{int n, t, i, op, x, y;
    ifstream in("disjoint.in");
    in>>n>>t;
    First=(list*)calloc( n, sizeof(vertex) );
    Last=(list*)calloc( n, sizeof(vertex) );
    for( i=1; i <= n; ++i ) //init
    {
        push( First[i], i );
        Last[i]=First[i];
    }
    ofstream out("disjoint.out");
    while( t-- )
    {
        in>>op>>x>>y;
        if( 1 == op )
        {
            if( First[x] == Last[x] ) //we have a single element in the x list
            {
                Last[x]->next=First[x]->next=First[y];
            }
            else Last[x]->next=First[y];
            Last[x]=Last[y];
            First[y]=First[x];
            continue;
        }
        if( x == y || find( First[x], First[y], x, y ) )
            out<<"DA\n";
        else out<<"NU\n";
    }
    return 0;
}