Pagini recente » Cod sursa (job #2480788) | Cod sursa (job #302339) | Cod sursa (job #1302293) | Cod sursa (job #2981021) | Cod sursa (job #1653625)
#include <fstream>
#include <vector>
using namespace std;
vector<int> sol;
void dfs(vector<vector<int>> G, vector<int> stack, vector<int> k)
{
int node = stack.back();
if (k[node] == 0)
{
sol[node] = 0;
}
else
{
sol[node] = sol[stack[stack.size() - k[node] - 1]] + 1;
}
for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); it++)
{
stack.push_back(*it);
dfs(G, stack, k);
stack.pop_back();
}
}
int main()
{
int n, i, x, y, root;
vector<int> k, grad;
vector<int> st;
vector<vector<int>> G;
ifstream f("cerere.in");
f >> n;
k.resize(n + 1);
grad.resize(n + 1, 0);
G.resize(n + 1);
sol.resize(n + 1);
for (i = 1; i <= n; i++)
{
f >> k[i];
}
for (i = 1; i <= n - 1; i++)
{
f >> x >> y;
G[x].push_back(y);
grad[y]++;
}
f.close();
for (i = 1; i <= n; i++)
{
if (grad[i] == 0)
{
root = i;
break;
}
}
st.push_back(root);
dfs(G, st, k);
ofstream g("cerere.out");
for (i = 1; i <= n; i++)
{
g << sol[i] << " ";
}
g.close();
return 0;
}