Cod sursa(job #3262566)

Utilizator Octavian1705octavian lupu Octavian1705 Data 10 decembrie 2024 19:23:27
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

const int NMAX = 100;
const int MMAX = NMAX * (NMAX - 1) / 2;
int t[NMAX + 5], h[NMAX + 5];

struct muchie
{
	int u, v, c;
	bool scl;
};

muchie mv[MMAX];

bool comp(muchie x, muchie y)
{
	return x.c < y.c;
}

int findr(int u)
{
	while (t[u] != u)
		u = t[u];
	return u;
}

bool unire(int u, int v)
{
	int ru, rv;
	ru = findr(u);
	rv = findr(v);
	if (ru != rv)
	{
		if (h[ru] > h[rv])
			t[rv] = ru;
		else if (h[rv] > h[ru])
			t[ru] = rv;
		else
		{
			t[rv] = ru;
			h[ru]++;
		}
		return 1;
	}
	return 0;
}

int main()
{
	int n, m, i, j, c,shows=0;
	fin >> n >> m;
	for (i = 1; i <= m; i++)
	{
		fin >> mv[i].c >> mv[i].u >> mv[i].v;
		if (mv[i].c != 1)
		{
			sort(mv + 1, mv + m + 1, comp);
			for (int j = 1; j <= n; j++)
				t[j] = j;
			int nr = 0;
			for (int j = 1; j <= m && nr < n - 1; ++j)
			{
				if (unire(mv[j].u, mv[j].v))
				{
					mv[j].scl = 1;
					nr++;
				}
			}
			if (mv[i].scl == 1)
				fout << "DA"<<"\n";
			else fout << "NU"<<"\n";
		}
	}
	return 0;
}