Cod sursa(job #2787745)

Utilizator TonioAntonio Falcescu Tonio Data 23 octombrie 2021 23:02:45
Problema BFS - Parcurgere in latime Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

const int noduriMAX = 100001;

class Graf
{
private:
	int nrNoduri;
	int nrMuchii;
	int plecareBFS;
	bool vizitat[noduriMAX] = { false };
	int distanta[noduriMAX] = { 0 };
	vector <vector<int>> adiacenta;
	queue <int> coadaBFS;
public:
	void GrafNeorientat();
	void DFS(int start);
	void NumaraCompCnx();
	void GrafOrientat();
	void BFS();
};

void Graf::GrafNeorientat()
{
	ifstream in("dfs.in");
	in >> nrNoduri >> nrMuchii;
	int start;
	int capat;
	adiacenta.resize(nrNoduri + 1);
	for (int i = 0; i < nrMuchii; ++i)
	{
		in >> start >> capat;
		adiacenta[start].push_back(capat);
		adiacenta[capat].push_back(start);
	}
	in.close();
}

void Graf::DFS(int start)
{
	vizitat[start] = true;
	for (int vecin : adiacenta[start])
	{
		if (!vizitat[vecin])
			DFS(vecin);
	}
}

void Graf::NumaraCompCnx()
{
	ofstream out("dfs.out");
	int nrCompCnx = 0;
	for (int i = 1; i <= nrNoduri; ++i)
	{
		if (!vizitat[i])
		{
			DFS(i);
			nrCompCnx++;
		}
	}
	out << nrCompCnx;
	out.close();
}

void Graf::GrafOrientat()
{
	ifstream in("bfs.in");
	in >> nrNoduri >> nrMuchii >> plecareBFS;
	int start;
	int capat;
	adiacenta.resize(nrNoduri + 1);
	for (int i = 0; i < nrMuchii; ++i)
	{
		in >> start >> capat;
		adiacenta[start].push_back(capat);
	}
	in.close();
}

void Graf::BFS()
{
	ofstream out("bfs.out");
	vizitat[plecareBFS] = true;
	coadaBFS.push(plecareBFS);
	while (!coadaBFS.empty())
	{
		plecareBFS = coadaBFS.front();
		coadaBFS.pop();
		for (int vecin : adiacenta[plecareBFS])
			if (!vizitat[vecin])
			{
				vizitat[vecin] = true;
				distanta[vecin] = distanta[plecareBFS] + 1;
				coadaBFS.push(vecin);
			}		
	}
	for (int i = 1; i <= nrNoduri; ++i)
	{
		if (!vizitat[i])
			out << -1 << " ";
		else
			out << distanta[i] << " ";
	}
		
	out.close();
}

int main()
{
	Graf g;
	//g.GrafNeorientat();
	//g.NumaraCompCnx();
	g.GrafOrientat();
	g.BFS();
	return 0;
}