Cod sursa(job #2302)

Utilizator hellraizerChiperi Matei hellraizer Data 16 decembrie 2006 20:37:28
Problema Asmax Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>

#define N_MAX 16001

int n,val[N_MAX],leg[N_MAX],nd[N_MAX],c[N_MAX],cap=1,coada=0,L[N_MAX],pus[N_MAX];

struct nod{
	int nr;
	nod *urm;
}*v[N_MAX];


void adaugare(int i,int nr){
	nod *p;
	p=new nod;
	p->urm=v[i];
	p->nr=nr;
	v[i]=p;
}

void citire(){
	int h,nr;
	FILE *fin=fopen("asmax.in","r");
	fscanf(fin,"%d\n",&n);
	for (int i=1;i<=n;i++)
		fscanf(fin,"%d",&val[i]);
	for (int i=1;i<n;i++){
		fscanf(fin,"%d %d",&h,&nr);
		adaugare(h,nr);
		adaugare(nr,h);
		leg[h]++;
		leg[nr]++;
	}
	fclose(fin);
	for (int i=1;i<=n;i++){
		L[i]=1;
		if (leg[i]==1){
			c[++coada]=i;
			pus[i]=1;
		}
	}
}

void prelucrare(){
	nod *j;
	while (cap!=(coada+1)){
		for (j=v[c[cap]];j!=NULL;j=j->urm)
			if (leg[j->nr]>0){
				if (val[j->nr]+val[c[cap]]>val[j->nr]){
					val[j->nr]+=val[c[cap]];
					L[j->nr]+=L[c[cap]];
				}
				leg[j->nr]--;
				leg[c[cap]]--;
				if (leg[j->nr]==1){
					coada=(coada+1)%N_MAX;
					c[coada]=j->nr;
					pus[j->nr]=1;
				}
			}
		cap++;
	}
		
}

void afisare(){
	FILE *fout=fopen("asmax.out","w");
	int max=-16000001,k;
	for (int i=1;i<=n;i++)
		if (max<val[i]){
			max=val[i];
			k=L[i];
		}
	fprintf(fout,"%d\n",k);
	fclose(fout);
}
	

int main(){
	citire();
	prelucrare();
	afisare();
	return 0;
}