Cod sursa(job #2390588)

Utilizator dornexDorneanu Eduard-Gabriel dornex Data 28 martie 2019 10:55:57
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>

using namespace std;

ifstream f("intrare.in");
ofstream g("disjoint.out");

struct Muchie{
	int a, b;
};

void uneste(vector< vector< int > > &lista_adiacenta, int a, int b)
{
	lista_adiacenta[a].push_back(b);
	lista_adiacenta[b].push_back(a);
}

void BFS(int a, vector <int> &viz, vector< vector< int > > lista_adiacenta)
{
	queue <int> Q;
	viz[a] = 1;
	Q.push(a);
	while(!Q.empty())
	{
		int nod = Q.front();
		Q.pop();
		for(auto i : lista_adiacenta[nod])
        {
            if(viz[i] == 0)
            {
                viz[i] = 1;
                Q.push(i);
            }
        }
	}
}

bool verifica(vector< vector< int > > &lista_adiacenta, int a, int b, int n)
{
	vector <int> viz(n+1, 0);
	BFS(a, viz, lista_adiacenta);
	return !viz[b];
}

int main()
{
	int n, m, x, y;
	f >> n >> m;

	vector< vector< int > > lista_adiacenta(n+1);

	for(int i = 1; i <= n; i++)
		lista_adiacenta[i].push_back(i);

	for(int i = 0; i < m; i++)
	{
		int optiune;
		f >> optiune;

		if(optiune == 1)
		{
			f >> x >> y;
			uneste(lista_adiacenta, x, y);
		}

		if(optiune == 2)
		{
			f >> x >> y;
			if(verifica(lista_adiacenta, x, y, n) == 1) cout <<"NU\n";
			else cout <<"DA\n";
		}

	}
	return 0;
}