Pagini recente » Cod sursa (job #1853009) | Cod sursa (job #2811751) | Cod sursa (job #1636068) | Cod sursa (job #1755964) | Cod sursa (job #2201713)
#include <stdio.h>
const int MAX_N = 100000;
struct TreeNodePointer
{
int id;
TreeNodePointer *next;
};
struct TreeNode
{
int id;
int value;
int n_commutes;
TreeNodePointer *children;
};
TreeNodePointer edges[MAX_N - 1];
TreeNode nodes[MAX_N];
int freq[MAX_N];
int was[MAX_N];
void dfs(TreeNode *root, int level = 0);
int main()
{
FILE *fin = fopen("cerere.in", "r"),
*fout = fopen("cerere.out", "w");
int n, m;
TreeNode *root;
fscanf(fin, "%d", &n);
m = n - 1;
for (int i = 0; i < n; i++)
{
fscanf(fin, "%d", &nodes[i].value);
nodes[i].id = i + 1;
}
for(int i = 0; i < m; i ++)
{
int a, b;
fscanf(fin, "%d %d", &a, &b);
freq[b - 1] ++;
edges[i].id = b;
edges[i].next = nodes[a - 1].children;
nodes[a - 1].children = &edges[i];
}
for(int i = 0; i < n; i++)
if(freq[i] == 0)
root = &nodes[i];
dfs(root);
for(int i = 0; i < n; i++)
fprintf(fout, "%d ", nodes[i].n_commutes);
fclose(fin);
fclose(fout);
return 0;
}
TreeNode* levels[MAX_N];
void dfs(TreeNode *root, int level)
{
levels[level] = root;
if(root->value == 0)
root->n_commutes = 0;
else root->n_commutes = 1 + levels[level - root->value]->n_commutes;
TreeNodePointer *x = root->children;
while(x != NULL)
{
dfs(&nodes[x->id - 1], level + 1);
x = x->next;
}
}