Cod sursa(job #3249261)

Utilizator PrizlopanIustinPrizlopan Iustin George PrizlopanIustin Data 15 octombrie 2024 18:33:19
Problema BFS - Parcurgere in latime Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <queue>
#include <list>
#include <fstream>
#include <unordered_set>
using namespace std; 
ifstream in("bfs.in");
ofstream out("bfs.out");
struct nod
{
	list <int> p;
}el[1000005];
void crearelista(nod el[], int n, int m,bool ordonat)
{
	int x1, x2;
	for (int i = 1; i <= m; i++)
	{
		in >> x1 >> x2;
		el[x1].p.push_back(x2);
		if (ordonat == 0)
			el[x2].p.push_back(x1);
	}
}
void afisarelista(nod el[], int n)
{
	for (int i = 1; i <= n; i++)
	{
		out << "Nodul " << i << " duce la urmatoarele noduri:" << '\n';
		for (auto p = el[i].p.begin(); p != el[i].p.end(); p++)
			out << *p << ' ';
		out << '\n';
	}
}
void clear(queue <int>& q1)
{
	std::queue<int> emp;
	swap(q1, emp);


};
bool alreadyvisited(int el, list<int> m)
{
	for (auto t = m.begin(); t != m.end(); t++)
		if (*t == el)
			return 1;
	return 0;
}
int BFS(nod el[],int final, int pas, queue <int> q1,unordered_set <int> s3)
{
	queue <int> q2;
	while (!q1.empty())
	{
		//std::cout << "Here";
		auto i = q1.front();
		q1.pop();
		if(s3.find(i)==s3.end())
		{
			s3.insert(i);
			//std::cout << i << "!";
			if (i == final)
			return pas;
		for (auto t = el[i].p.begin(); t != el[i].p.end(); t++)
			q2.push(*t);
		}
	}
	if (!q2.empty())
		return BFS(el, final, pas + 1, q2,s3);
	return -1;
};




int main()
{
	int n, m, s;
	in >> n >> m >> s;
	crearelista(el, n, m, 1);
	//afisarelista(el, n);
	unordered_set <int> p;
	queue <int> q1;
	for (int i = 1; i <= n; i++)
	{
		q1.push(s);
		out << BFS(el, i, 0, q1, p)<<' ';
		clear(q1);
		p.clear();
	}


}