Cod sursa(job #749969)

Utilizator gabrielvGabriel Vanca gabrielv Data 19 mai 2012 20:35:41
Problema Asmax Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<cstdio>
#include<vector>
#define NMAX 16005
#define nr_char 96200
#define oo (1<<30)
#define maxim(a,b) ((a>b)?(a):(b))

using namespace std;

vector < int > G[NMAX];
char line[nr_char];
int best[NMAX],N,begin,Sol;

bool digit(char chs)
{
    if('0'<=chs && chs<='9')
        return true;
    return false;
}
void compute(int &n)
{
    bool ok=0;
    if(line[begin]=='-')
    {
        ok=1;
        begin++;
    }
    n=0;
    for(;digit(line[begin]);begin++)
        n=n*10+int(line[begin]-'0');
    begin++;
    if(ok)
        n=-n;
}
void citire()
{
    freopen("asmax.in","r",stdin);
    fgets(line+1,nr_char-3,stdin);
    begin=1;
    compute(N);
    fgets(line+1,nr_char-3,stdin);
    begin=1;
    int i,x,y;
    for(i=1;i<=N;i++)
        compute(best[i]);
    for(i=1;i<=N;i++)
    {
        fgets(line+1,nr_char-3,stdin);
        begin=1;
        compute(x);
        compute(y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
}
void DFS(int nod, int father)
{
    unsigned i;
    for(i=0;i<G[nod].size();i++)
        if(G[nod][i]!=father)
        {
            DFS(G[nod][i],nod);
           // best[nod]=maxim(best[nod],best[nod]+best[G[nod][i]]);
			if(best[G[nod][i]]>0)
				best[nod]+=best[G[nod][i]];
        }
}
void BVO()
{
    DFS(1,0);
    Sol=-oo;
    int i;
    for(i=1;i<=N;i++)
        Sol=maxim(Sol,best[i]);
}
void afisare()
{
    freopen("asmax.out","w",stdout);
    printf("%d\n",Sol);
}
int main()
{
    citire();
    BVO();
    afisare();
    return 0;
}