Cod sursa(job #2201713)

Utilizator alexge50alexX AleX alexge50 Data 5 mai 2018 16:32:59
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#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;
    }
}