Cod sursa(job #2939455)

Utilizator Gica-gicutaGeorge Gica-gicuta Data 13 noiembrie 2022 18:32:04
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include<bits/stdc++.h>
using namespace std;
const int N = 100;
vector<int> v[N];
int n,T[N],downVal[N],upVal[N],secondVal[N];
/// downVal[nod] suma maxima pe care o pot obtine placand din nod spre un fiu al sau
/// secondVal[nod] a doua cea mai mare suma pe cate o pot obtine plecand din nod spre un fiu al sau
/// upVal[nod] suma maxima pe care o pot obtine daca plec din nod spre tatal sau
void dfs1(int nod,int tata)
{
    T[nod]=tata;
    int best1=0,best2=0,valFiu=0;
    for(auto vec:v[nod])
        if(vec!=tata)
        {
            dfs1(vec);
            valFiu=downVal[vec];
            if(valFiu>best1)
            {
                best2=best1;
                best1=valFiu;
            }
            else if(valFiu>best2)
                best2=valFiu;
        }
    downVal[nod]=best1+val[nod];
    secondVal[nod]=best2+val[nod];
}
void dfs2(int nod)
{
    /// prima data setez distUp pentru nod
    if(nod!=1)
    {
        if(downVal[nod]+val[nod]==valDown[tata])
            upVal[nod]=val[nod]+secondVal[tata];
        else
            upVal[nod]=val[nod]+downVal[tata];
        upVal[nod]=max(upVal[nod],val[nod]+upVal[tata]);
    }
    else
        upVal[nod]=val[nod];
    for(auto vec:v[nod])
        if(vec!=tata)
            dfs2(vec);
}
int main ()
{
    f>>n;
    for(int i=1;i<=n;i++)
        f>>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);
    }
    /// pasul 1 dinamica in jos
    /// detrermin distanta maxima de la un nod pana la o frunza din subarbore downDist[nod]
    dfs1(1,0);
    /// pasul 2 dinamica in sus
    /// determin distanta maxima daca din nod plec spre tata
    dfs2(1,0);
    for(int i=1;i<=n;i++)
        g<<max(downVal[nod],upVal[nod])<<'\n';
    return 0;
}