Pagini recente » Cod sursa (job #2161430) | Cod sursa (job #2667245) | Cod sursa (job #2141281) | Cod sursa (job #1122864) | Cod sursa (job #50450)
Cod sursa(job #50450)
#include <stdio.h>
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define MaxN 16001
#define INF 10000001
int N;
int asmax[MaxN], v[MaxN], sel[MaxN];
struct NOD {
int vf;
NOD* next;
};
typedef NOD* PNOD;
PNOD L[MaxN];
void df(int varf)
{
sel[varf] = 1;
asmax[varf] = v[varf];
for (PNOD p = L[varf]; p; p = p->next)
if (!sel[p->vf])
{
df(p->vf);
if (asmax[varf] < asmax[varf] + asmax[p->vf])
asmax[varf] = asmax[varf] + asmax[p->vf];
}
if (asmax[varf] < 0) asmax[varf] = 0;
}
void Add(int i, int j)
{
PNOD p = new NOD;
p->vf = j;
p->next = L[i];
L[i] = p;
}
int main()
{
int i, v1, v2;
FILE *fin = fopen("asmax.in", "rt");
fscanf(fin, "%d", &N);
FOR(i, 1, N)
fscanf(fin, "%d", &v[i]);
FOR(i, 1, N-1)
{
fscanf(fin, "%d %d", &v1, &v2);
Add(v1, v2); Add(v2, v1);
}
fclose(fin);
FOR(i, 1, N) asmax[i] = -INF;
df(1);
int maxim = -1;
FOR(i, 1, N)
if (asmax[i] > maxim) maxim = asmax[i];
FILE *fout = fopen("asmax.out", "wt");
fprintf(fout, "%d", maxim);
fclose(fout);
return 0;
}