Cod sursa(job #2955322)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 16 decembrie 2022 18:48:45
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>

#define NMAX 100003
#define MOD 30011

using namespace std;



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

int n, rad;
int dist[NMAX + 3];//distanta/ urmatorul dist[i] tata unde trebuie sa ajung
int stiva[NMAX + 3];//asta e stiva pt dfs
int rez[NMAX + 3];//vectorul de rezultat
bool viz[NMAX + 3];

vector<int>graf[NMAX + 3];

void dfs(int rad)
{
	int nivel = 1;//nivelul stivei
	stiva[nivel] = rad;
	rez[rad] = 0;//e radacina arb
	viz[rad] = true;//e vizitat
	while (nivel > 0)
	{
		int prec = stiva[nivel];
		bool amUrm = false;
		//acum gasesc urmatorul fiu pe care sa il parcurg
		for (int i = 0; i < graf[prec].size(); i++)
		{
			int nod = graf[prec][i];
			if (!viz[nod])
			{
				//adaug in stiva de dfs si marchez vizitat
				stiva[++nivel] = nod;
				viz[nod] = true;

				if (dist[nod] == 0)
				{
					rez[nod] = 0;//mna e maimuta desteapta
				}
				else {
					int tataPrec = nivel - dist[nod];//gasesc din stiva mea nodul aflat la distanta dist[i] deasupra
					rez[nod] = rez[stiva[tataPrec]] + 1;//iau rezultatul
				}

				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;//vreau sa vad care e radacina arborelui(artificiu)
		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;
}