Cod sursa(job #2812420)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 4 decembrie 2021 15:02:13
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>
#include <deque>
#include <vector>

using namespace std;
const int NMAX = 16000, INF = 1e7;

vector<int> edges[NMAX];
int smax[NMAX], val[NMAX], ord[NMAX];
bool vis[NMAX];
deque<int> dq;

void setOrd(int root, int ord[], int n);
int getMax(int ord[], int n);

int main()
{
    int n, i, v1, v2, root, maxx;
    FILE *fin = fopen("asmax.in", "r");
    fscanf(fin, "%d", &n);
    for (i = 0; i < n; i++)
        fscanf(fin, "%d", &val[i]);
    for (i = 0; i < n - 1; i++)
    {
        fscanf(fin, "%d%d", &v1, &v2);
        v1--, v2--;
        edges[v1].push_back(v2);
        edges[v2].push_back(v1);
    }
    fclose(fin);
    root = 0;
    setOrd(root, ord, n);
    maxx = getMax(ord, n);
    FILE *fout = fopen("asmax.out", "w");
    fprintf(fout, "%d", maxx);
    fclose(fout);

    return 0;
}

void setOrd(int root, int ord[], int n)
{
    int i, len, nextnode, node;
    dq.push_front(root);
    while (!dq.empty())
    {
        node = dq.back();
        dq.pop_back();
        vis[node] = 1;
        ord[--n] = node;
        len = edges[node].size();
        for (i = 0; i < len; i++)
        {
            nextnode = edges[node][i];
            if (!vis[nextnode])
                dq.push_front(nextnode);
        }
    }
}
int getMax(int ord[], int n)
{
    int maxx = -INF;
    for (int i = 0; i < n; i++)
    {
        int node = ord[i];
        vis[node] = 0;
        smax[node] = val[node];
        int len = edges[node].size(), nextnode;
        for (int j = 0; j < len; j++)
        {
            nextnode = edges[node][j];
            if (!vis[nextnode])
                smax[node] += max(smax[nextnode], 0);
        }
        maxx = max(maxx, smax[node]);
    }
    return maxx;
}