Pagini recente » Cod sursa (job #2455121) | Cod sursa (job #337633) | Cod sursa (job #1648937) | Cod sursa (job #2356934) | Cod sursa (job #2812420)
#include <stdio.h>
#include <deque>
#include <vector>
using namespace std;
const int NMAX = 16000, INF = 1e7;
vector<int> edges[NMAX];
int smax[NMAX], val[NMAX], ord[NMAX];
bool vis[NMAX];
deque<int> dq;
void setOrd(int root, int ord[], int n);
int getMax(int ord[], int n);
int main()
{
int n, i, v1, v2, root, maxx;
FILE *fin = fopen("asmax.in", "r");
fscanf(fin, "%d", &n);
for (i = 0; i < n; i++)
fscanf(fin, "%d", &val[i]);
for (i = 0; i < n - 1; i++)
{
fscanf(fin, "%d%d", &v1, &v2);
v1--, v2--;
edges[v1].push_back(v2);
edges[v2].push_back(v1);
}
fclose(fin);
root = 0;
setOrd(root, ord, n);
maxx = getMax(ord, n);
FILE *fout = fopen("asmax.out", "w");
fprintf(fout, "%d", maxx);
fclose(fout);
return 0;
}
void setOrd(int root, int ord[], int n)
{
int i, len, nextnode, node;
dq.push_front(root);
while (!dq.empty())
{
node = dq.back();
dq.pop_back();
vis[node] = 1;
ord[--n] = node;
len = edges[node].size();
for (i = 0; i < len; i++)
{
nextnode = edges[node][i];
if (!vis[nextnode])
dq.push_front(nextnode);
}
}
}
int getMax(int ord[], int n)
{
int maxx = -INF;
for (int i = 0; i < n; i++)
{
int node = ord[i];
vis[node] = 0;
smax[node] = val[node];
int len = edges[node].size(), nextnode;
for (int j = 0; j < len; j++)
{
nextnode = edges[node][j];
if (!vis[nextnode])
smax[node] += max(smax[nextnode], 0);
}
maxx = max(maxx, smax[node]);
}
return maxx;
}