Cod sursa(job #3249218)

Utilizator PrizlopanIustinPrizlopan Iustin George PrizlopanIustin Data 15 octombrie 2024 15:44:14
Problema BFS - Parcurgere in latime Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb

#include <iostream>
#include <fstream>
#include <list>
using namespace std;
ifstream in("bfs.in");
ofstream out("bfs.out");
int n, m;
 
struct element
{
	list <int> elemente;
}el[100001];

void afisare(int v[101][101],int varfuri)
{
	for (int i = 1; i <= varfuri; i++)
	{
		for (int j = 1; j <= varfuri; j++)
			std::cout << v[i][j];
		std::cout << '\n';
	}
	}
void memorare(int v[101][101],int ordonat)
{
	//int n, m;
	//in >> n >> m; 
	int x1, x2;
	//std::cout << n << ' ' << m;
	for (int i = 1; i <= m; i++)
	{
		in >> x1 >> x2;
		v[x1][x2] = 1;
		if (ordonat == 0)
			v[x2][x1] = 1;
	}
}
void memorare2(element el[], int ordonat)
{
	int x1, x2;
	for (int i = 1; i <= m; i++)
	{
		in >> x1 >> x2;
		el[x1].elemente.push_back(x2);
		if (ordonat == 0)
			el[x2].elemente.push_back(x1);
	}
};
void afisare2(element el[], int varfuri)
{
	for (int i = 1; i <= varfuri; i++)
	{
		std::cout << "Nodul " << i << " este adiacent cu: " << '\n';
		for (auto it = el[i].elemente.begin(); it != el[i].elemente.end(); it++)
			std::cout << *it<<' ';
		std::cout << '\n';

	}
}
void ListaToMatrice(element el[], int v[101][101],int varfuri)
{
	for (int i = 1; i <= varfuri; i++)
	{
		for (auto it = el[i].elemente.begin(); it != el[i].elemente.end(); it++)
		{
			v[i][*it] = 1;
		}
	}
}
void MatriceToLista(element el[], int v[101][101], int varfuri)
{
	for(int i=1;i<=varfuri;i++)
		for (int j = 1; j <= varfuri; j++)
		{
			if (v[i][j] == 1)
				el[i].elemente.push_back(j);
		}
};

int BFS(element el[], bool parcurse[],int current, int ideal, int n, int pas)
{
	parcurse[current] = 1;
	if (current == ideal)
	{
		//std::cout << "!";
		return pas;
	}
	int minim = 8888;
	for (auto t = el[current].elemente.begin(); t != el[current].elemente.end(); t++)
	{
		if (parcurse[*t] != 1)
		{
			//std::cout << *t;
			minim = std::min(minim, BFS(el, parcurse, *t, ideal, n, pas + 1));
			//parcurse[*t] = 0;
		}
	}
	return minim; 
};

int main()
{
	//int n, m;
	int nod;
	in >> n >> m>>nod;
	memorare2(el, 1);
	//ListaToMatrice(el, v, n);
	//afisare2(el, n);
	bool parcurse[100005] = { 0 };
	for (int i = 1; i <= n; i++)
	{
		int val = BFS(el, parcurse, nod, i, n, 0);
		//int val = 1;
		if (val == 8888)
			out << -1 << ' ';
		else
			out << val<<" ";
		for (int i = 1; i <= n; i++)
			parcurse[i] = 0;

	}


	return 0;
}