Cod sursa(job #1199966)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 21 iunie 2014 13:15:50
Problema Asmax Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream f("asmax.in");
ofstream o("asmax.out");
vector <int> a[20000];
int v[20000],m,n,parc[20000],maxim=-100000000,sus[20000],jos[20000];
void df(int nod){
	parc[nod]=1;
	jos[nod] = v[nod];
	maxim = max(maxim,jos[nod]);
	  for(int i=0;i<a[nod].size();i++)if(parc[a[nod][i]]!=1){
	  	df(a[nod][i]);
	  	if(jos[a[nod][i]]>0)
	  	jos[nod]+=jos[a[nod][i]];
		maxim = max(maxim,jos[nod]);
	  }
	  
	  
	parc[nod]=0;
}
void df1(int nod){
		parc[nod]=1;
		
	  for(int i=0;i<a[nod].size();i++)
	  if(parc[a[nod][i]]!=1){	
	       // if(v[a[nod][i]])sus[a[nod][i]]=v[a[nod][i]];
	    	if(sus[nod]>0)sus[a[nod][i]] += sus[nod];
	  	 for(int j=0;j<a[nod].size();j++){
	  	 	if(i!=j && parc[a[nod][j]]!=1){
	  	 		if(v[nod]+jos[a[nod][j]]>0)
	  	 		sus[a[nod][i]]+=v[nod]+jos[a[nod][j]];
	  	 	}
	  	 }
	  	 maxim = max(maxim,sus[a[nod][i]]);
	  	 maxim = max(maxim,sus[a[nod][i]]+jos[a[nod][i]]);
	  	 maxim = max(maxim,sus[a[nod][i]]+v[a[nod][i]]);
	 // 	o<<maxim<<" " <<a[nod][i]<<endl;
	  	df1(a[nod][i]);
	  }
	parc[nod]=0;
}
int main(){
	f>>n;
	for(int i=1;i<=n;i++)f>>v[i],sus[i]=jos[i]=0;
	int x,y;
	for(int i=1;i<n;i++){
		f>>x>>y;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	df(1);
	df1(1);
	o<<maxim;
}