Pagini recente » Cod sursa (job #2971287) | Cod sursa (job #815448) | Cod sursa (job #13758) | Cod sursa (job #3292408) | Cod sursa (job #2939455)
#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;
}