Cod sursa(job #2792212)

Utilizator lolotbogdanLolot Stefan-Bogdan lolotbogdan Data 1 noiembrie 2021 09:50:16
Problema BFS - Parcurgere in latime Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <list>
#include <queue>

using namespace std;

ifstream f("bfs.in");
ofstream o("bfs.out");

class Graf {
	int noduri, muchii;
	unordered_map<int, list<int>>vecini;
	unordered_map<int, bool> vizitat;

public:
	Graf(int n, int m);
	int get_noduri();
	int get_muchii();
	int get_vizitat(int nod);
	void adauga_muchie_neorientat(int nod1, int nod2);
	void adauga_muchie_orientat(int nod1, int nod2);
	void sorteaza();
	void dfs(int varf);
	void componente_conexe();
	void bfs(int varf);
};

Graf::Graf(int n, int m)
{
	this -> noduri = n;
	this -> muchii = m;
	for (int i = 1; i <= n; i++)
		vizitat[i] = 0;
}

int Graf::get_noduri()
{
	return this -> noduri;
}

int Graf::get_muchii()
{
	return this -> muchii;
}

int Graf::get_vizitat(int nod)
{
	return vizitat[nod];
}

void Graf::adauga_muchie_neorientat(int nod1, int nod2)
{
	vecini[nod1].push_back(nod2);
	vecini[nod2].push_back(nod1);
}

void Graf::adauga_muchie_orientat(int nod1, int nod2)
{
	vecini[nod1].push_back(nod2);
}

void Graf::sorteaza()
{
	for (int i = 1; i <= noduri; i++)
		vecini[i].sort();
}

void Graf::dfs(int varf)
{
	//cout << varf << " ";
	vizitat[varf] = 1;

	for (auto i = vecini[varf].begin(); i != vecini[varf].end(); i++)
		if (vizitat[*i] != 1)
			dfs(*i);
}

void Graf::componente_conexe()
{
	int sol = 0;
	int N = this -> get_noduri();
	this -> sorteaza();

	for (int i = 1; i <= N; i++)
		if (this -> get_vizitat(i) != 1)
		{
			sol += 1;
			this -> dfs(i);
		}

	cout << sol;
}

void Graf::bfs(int varf)
{
	int start = varf;
	queue<int>coada;
	vizitat[varf] = 1;
	coada.push(varf);

	unordered_map<int, int>distanta;
	for (int i = 1; i <= noduri; i++)
		distanta[i] = 0;

	while (coada.size())
	{
		varf = coada.front();
		//cout << varf << " ";
		coada.pop();
		for(auto i = vecini[varf].begin(); i != vecini[varf].end(); i++)
			if (!vizitat[*i])
			{
				vizitat[*i] = 1;
				coada.push(*i);
				distanta[*i] = distanta[varf] + 1;
			}
	}
	for (int i = 1; i <= noduri; i++)
		if (i != start && distanta[i] == 0)
			o << "-1" << " ";
		else
			o << distanta[i] << " ";
}

int main()
{
	int N, M, X;

	f >> N >> M >> X;

	Graf g(N, M);

	for (int i = 1; i <= M; i++)
	{
		int st, dr;
		f >> st >> dr;
		g.adauga_muchie_orientat(st, dr);
	}

	g.bfs(X);
	
	return 0;
}