Cod sursa(job #386933)

Utilizator vladiiIonescu Vlad vladii Data 26 ianuarie 2010 12:46:20
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define INF -999999999
vector<int> G[16001], PO;
int N, val[16001], S[16001];
bool viz[16001];

void DetArbore(int nod) {
    int p, q;
    vector<int> X;
    queue<int> Q;
    Q.push(nod); viz[nod]=1;
    while(!Q.empty()) {
         p=Q.front(); Q.pop();
         for(vector<int>::iterator it=G[p].begin(); it!=G[p].end(); it++) {
              q=(*it);
              if(!viz[q]) {
                   viz[q]=1;
                   Q.push(q);
                   X.push_back(q);
              }
         }
         G[p].clear();
         for(vector<int>::iterator it=X.begin(); it!=X.end(); it++) {
              G[p].push_back((*it));
         }
         X.clear();
    }
}

void BFS(int nod) {
    queue<int> Q;
    int p, q;
    Q.push(nod); PO.push_back(nod);
    while(!Q.empty()) {
         p=Q.front(); Q.pop();
         for(vector<int>::iterator it=G[p].begin(); it!=G[p].end(); it++) {
              Q.push((*it));
              PO.push_back((*it));
         }
    } 
}

int main() {
    fstream f1, f2;
    int i, j, p, q, maxim;
    f1.open("asmax.in", ios::in);
    f1>>N;
    for(i=1; i<=N; i++) {
         f1>>val[i];
    }
    for(i=1; i<N; i++) {
         f1>>p>>q;
         G[p].push_back(q);
         G[q].push_back(p);
    }
    f1.close();
    DetArbore(1); //agat arborele in nodul 1
    BFS(1);
    for(i=PO.size()-1; i>=0; i--) {
         p=PO[i];
         if(!G[p].size()) {
              S[p]=val[p];
         }
         else {
              for(vector<int>::iterator it=G[p].begin(); it!=G[p].end(); it++) {
                   if(S[(*it)]>0) {
                        S[p]+=S[(*it)];
                   }
              }
              S[p]+=val[p];
         }
         //if(S[p]<0) { S[p]=0; }
    }
    maxim=INF;
    for(i=1; i<=N; i++) {
         maxim=max(maxim, S[i]);
    }
    if(N==1) { maxim=val[1]; }
    f2.open("asmax.out", ios::out);
    f2<<maxim<<endl;
    f2.close();
    return 0;
}