Cod sursa(job #1158680)

Utilizator shervladVlad Seremet shervlad Data 28 martie 2014 23:44:08
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");

struct edge
{
	int v1;
	int v2;
	int l;
};
struct  node
{
	int parent;
	int r;
};


int f(int x,vector<node> &vec)
{
    	if(vec[x].parent!=x)
		vec[x].parent=f(vec[x].parent,vec);
		else
	    return x;
}

void link(int x, int y,vector<node> &vec)
{
	if(vec[x].r<=vec[y].r)
	{
		vec[x].parent=y;
		if(vec[x].r==vec[y].r)
		vec[y].r++;
	}
	else
	{
		vec[y].parent=x;
	}
}
void un(int x,int y,vector<node> &vec)
{
	link(f(x,vec),f(y,vec),vec);
}

void make_set(int x,vector<node> &vec)
{
	vec[x].parent=x;
	vec[x].r=0;
}


int main()
{
	int n,m;
	in>>n>>m;
	vector<node> vec(1);
	for(int i=1;i<=n;i++)
		{
		    node tmp;
		    vec.push_back(tmp);
		    make_set(i,vec);
		}
	int i,j,k;
	for(int i=1;i<=m;i++)
	{
		in>>i>>j>>k;
		if(i==1)
			un(j,k,vec);
		if(i==2)
		{
			if(f(k,vec)==j || f(j,vec)==k)
				out<<"DA"<<endl;
			else
				out<<"NU"<<endl;
		}
	}
	return 0;
}