Pagini recente » Cod sursa (job #1226755) | Cod sursa (job #2463369) | Cod sursa (job #726657) | Cod sursa (job #2569836) | Cod sursa (job #1595892)
#include<fstream>
#define NRMN 16001// numar maxim noduri
using namespace std;
FILE*in;
ofstream out("asmax.out");
int nr_noduri;
int values[NRMN];
long int BEST[NRMN];
bool visited[NRMN];
int *LA[NRMN];
long int maxim_from_BEST;
void read()
{
in=fopen("asmax.in", "r");
fscanf(in, "%d", &nr_noduri);
for (int i=1; i<=nr_noduri; i++)
{
fscanf(in, "%d", &values[i]);
LA[i]=(int *)realloc(LA[i], sizeof(int));
LA[i][0]=0;
}
for (int i=1; i<nr_noduri; i++)
{
int x, y;
fscanf(in, "%d%d", &x, &y);
LA[x][0]++;
LA[x]=(int *)realloc(LA[x], (LA[x][0]+1)*sizeof(int));
LA[x][LA[x][0]]=y;
LA[y][0]++;
LA[y]=(int *)realloc(LA[y], (LA[y][0]+1)*sizeof(int));
LA[y][LA[y][0]]=x;
}
}
void DFS(int nod)
{
visited[nod]=true;
for (int i=1; i<=LA[nod][0]; i++)
if (!visited[LA[nod][i]])
DFS(LA[nod][i]);
BEST[nod]=values[nod];
for (int i=1; i<=LA[nod][0]; i++)
if (BEST[LA[nod][i]] > 0)
BEST[nod]+=BEST[LA[nod][i]];
}
void find_maxim_from_BEST()
{
maxim_from_BEST=BEST[1];
for (int i=2; i<=nr_noduri; i++)
if (BEST[i] > maxim_from_BEST)
maxim_from_BEST=BEST[i];
}
void solve()
{
DFS(1);
find_maxim_from_BEST();
}
void show()
{
out<<maxim_from_BEST;
}
int main()
{
read();
solve();
show();
return 0;
}