Cod sursa(job #3314243)

Utilizator GabiRB1Rafael GabiRB1 Data 9 octombrie 2025 08:25:22
Problema Asmax Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
long long n, val[20000] , fr[200005], t[200005],s[200005];
bool viz[200005];
vector <int> v[20000];
void dfs(int k) {
    viz[k] = 1;
    for (int i = 0; i < v[k].size(); i++) {
        if (viz[v[k][i]] == 0)
            t[v[k][i]] = k, dfs(v[k][i]);
    }
}
int main()
{
    ifstream f("asmax.in");
    ofstream g("asmax.out");
    f >> n;
    for (int i= 1; i <= n; i++)
        f >> val[i], s[i] = val[i];
    for (int i = 1; i < n ; i ++) {
        int x, y;
        f >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
        fr[x] ++;
        fr[y] ++;
    }
    deque <int> q;
    dfs(1);
    memset(viz, 0, sizeof(viz));
    for (int i = 1; i <= n; i ++)
        if (fr[i] == 1) {
            q.push_back(i);
        }
    while (!q.empty()) {
        int x = q.front();
        q.pop_front();
        s[x] =  max(s[x], 0 *  1LL);
        if (viz[x] == 0) {
            viz[x] = 1;
            s[t[x]] += s[x];
            fr[t[x]] --;
            if (fr[t[x]] == 1 && x != 1) {q.push_back(t[x]);}
            else if (fr[t[x]] == 1 && x == 1) q.push_back(t[x]);
        }
    }
    long long maxx = 0;
    for (int i = 1; i <= n;i ++)
        maxx = max(maxx, s[i]);
    g << maxx;
    return 0;

}