Pagini recente » Cod sursa (job #1968694) | Cod sursa (job #819978) | Cod sursa (job #1721193) | Cod sursa (job #1564210) | Cod sursa (job #391870)
Cod sursa(job #391870)
#include <fstream>
#include <vector>
#define pb push_back
#define NMAX 100100
using namespace std;
int N, Stack, kStr[NMAX], sol[NMAX], treeRoot, St[NMAX], hSt;
bool areTata[NMAX];
vector<int> T[NMAX];
void Citire(void)
{
ifstream fin("cerere.in");
int i, x, y;
fin >>N;
for (i = 1; i <= N; i++)
fin >>kStr[i];
for (i = 1; i < N; i++)
fin >>x >>y, areTata[y] = 1, T[x].pb(y);
//Initializare
for (i = 1; i <= N; i++)
if (!areTata[i])
treeRoot = i;
for (i = 1; i <= N; i++)
sol[i] = -1;
fin.close();
}
void DFS(int i)
{
int j;
if (kStr[i] != 0)
sol[i] = sol[St[hSt - kStr[i]]] + 1;
else
sol[i] = 0;
for (j = 0; j < T[i].size(); j++)
{
hSt++;
St[hSt] = T[i][j];
DFS(T[i][j]);
hSt--;
}
}
void Rezolva(void)
{
hSt++;
St[hSt] = treeRoot;
sol[treeRoot] = 0;
DFS(treeRoot);
}
void Afisare(void)
{
ofstream fout("cerere.out");
for (int i = 1; i <= N; i++)
fout <<sol[i] <<' ';
fout.close();
}
int main()
{
Citire();
Rezolva();
Afisare();
return 0;
}