Pagini recente » Cod sursa (job #2384595) | Cod sursa (job #1869175) | Cod sursa (job #858367) | Cod sursa (job #1638247) | Cod sursa (job #386933)
Cod sursa(job #386933)
#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;
}