Cod sursa(job #2833694)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 15 ianuarie 2022 15:14:17
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <unordered_map>
#include <cstring>
#include <climits>

#define NMAX 100003
using namespace std;

int n,rad;
int dist[NMAX + 3];
int stiva[NMAX + 3];
int rez[NMAX + 3];
bool viz[NMAX + 3];

vector<int>graf[NMAX + 3];

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

void dfs(int rad)
{
	int nivel = 1;
	stiva[nivel] = rad;
	rez[rad] = 0;//e radacina arb
	viz[rad] = true;
	while (nivel>0)
	{
		int prec = stiva[nivel];
		bool amUrm = false;
		for (int i = 0; i < graf[prec].size(); i++)
		{
			int nod = graf[prec][i];
			if (!viz[nod])
			{
				//adaug in coada
				stiva[++nivel] = nod;
				viz[nod] = true;

				if (dist[nod] == 0)
				{
					rez[nod] = 0;
				}
				else {
					int tataPrec = nivel - dist[nod];
					rez[nod] = rez[stiva[tataPrec]] + 1;
				}
				
				amUrm = true;
				break;
			}
		}
		if (!amUrm)
		{
			nivel--;
		}
		
	}

}

int main()
{
	fin >> n;
	for (int i = 1; i <= n; i++)
	{
		fin >> dist[i];
	}
	for (int i = 1; i < n; i++)
	{
		int x, y;
		fin >> x >> y;
		viz[y] = true;
		graf[x].push_back(y);
	}
	for (int i = 1; i <= n; i++)
	{
		if (!viz[i])
		{
			rad = i;
			break;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		viz[i] = false;
	}
	dfs(rad);
	for (int i = 1; i <= n; i++)
	{
		fout << rez[i] << " ";
	}
	return 0;
}