Cod sursa(job #3282235)

Utilizator RaaaareeesLeah Rares Raaaareees Data 4 martie 2025 20:55:00
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.65 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("bfs.in");
ofstream fout("bfs.out");

int nvizitat[100001] = { 0 };
int coada[100001] = { 0 };
int drum[100001] = { 0 };

int m = 0;

struct muchie
{
	int a;
	int b;
};

muchie lmuchi[1000001];
muchie c[1000001];

bool cb(int a, int b)
{
	int st = 0;
	int dr = m;
 
	while (st < dr)
	{
		int mij = (st + dr) / 2;
		
		if (lmuchi[mij].a == a && lmuchi[mij].b == b)
		{
			return true;
		}

		else if (lmuchi[mij].a < a || (lmuchi[mij].a == a && lmuchi[mij].b < b))
		{
			st = mij + 1;
		}

		else
		{
			dr = mij - 1;
		}
	}

	return false;
}
void interclasare(muchie a[], muchie b[], int nst, int ndr)
{
	int i = 0;
	int j = 0;
	int k = 0;

	while (i < nst && j < ndr)
	{
		if (a[i].a < b[j].a)
		{
			c[k].a = a[i].a;
			c[k].b = a[i].b;
			i++;
			k++;
		}
		else if (a[i].a > b[j].a)
		{
			c[k].a = b[j].a;
			c[k].b = b[j].b;
			j++;
			k++;
		}
		else
		{
			if (a[i].b < b[j].b)
			{
				c[k].a = a[i].a;
				c[k].b = a[i].b;
				i++;
				k++;
			}
			else
			{
				c[k].a = b[j].a;
				c[k].b = b[j].b;
				j++;
				k++;
			}
		}
	}

	while (i < nst)
	{
		c[k].a = a[i].a;
		c[k].b = a[i].b;
		k++;
		i++;
	}
	while (j < ndr)
	{
		c[k].a = b[j].a;
		c[k].b = b[j].b;
		j++;
		k++;
	}
}

void mergesort(muchie* a, int n)
{
	if (n <= 1)
	{
		return;
	}

	int mij = n / 2;
	int nrelemst = mij;
	int nrelemdr = mij + n % 2;
	
	muchie* st = a + 0;
	muchie* dr = a + mij;

	mergesort(st, nrelemst);
	mergesort(dr, nrelemdr);

	interclasare(st, dr, nrelemst, nrelemdr);

	for (int y = 0; y < n; y++)
	{
		a[y].a = c[y].a;
		a[y].b = c[y].b;
	}

}

bool valid(int a, int b)
{
	if (cb(a,b))
	{
		return true;
	}
	
	return false;
}

void citire(int m, int n)
{
	int i = 0;
	int j = 0;

	for (int x = 0; x < m; x++)
	{
		fin >> i >> j;
		lmuchi[x].a = i;
		lmuchi[x].b = j;
	}
	for (int x = 1; x <= n; x++)
	{
		drum[x] = -1;
	}
}

int l = 0;

void bfs(int k, int n)
{
	nvizitat[k] = 1;

	coada[l] = k;
	l++;

	drum[k] = 0;

	int index = 0;

	while (index < l)
	{
		int ncurent = coada[index];
		
		for (int x = 1; x <= n; x++)
		{
			if (valid(ncurent,x))
			{
				if (nvizitat[x] == 0)
				{
					coada[l] = x;
					l++;
					nvizitat[x] = 1;
					drum[x] = drum[ncurent] + 1;
				}
			}
		}
		index++;
	}
}

void afisare(int n)
{
	for (int x = 1; x <= n; x++)
	{
		fout << drum[x] << " ";
	}
}

int main()
{
	int n = 0;
	int x = 0;

	fin >> n >> m >> x;

	citire(m,n);

	mergesort(lmuchi, m);

	bfs(x, n);

	afisare(n);
}