Cod sursa(job #586380)

Utilizator maritimCristian Lambru maritim Data 30 aprilie 2011 19:53:28
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<stdio.h>
#include<malloc.h>

#define INF 100000

typedef struct _nod
{
	int info;
	struct _nod *adr;
} nod;

typedef struct
{
	struct _nod *cap;
} list;

list A[16001];
int D[16001];
int N;
int viz[16001];
int grad[16001];
int MAX = -INF;
int OK = 0;

void add(int a,int b)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = b;
	nou->adr = A[a].cap;
	A[a].cap = nou;
}

void citire(void)
{
	int a;
	int b;
	FILE *f = fopen("asmax.in","r");
	
	fscanf(f,"%d",&N);
	for(int i=1;i<=N;i++)
	{
		fscanf(f,"%d",&D[i]);
		if(D[i] > 0)
			OK = 1;
	}
	for(int i=1;i<=N-1;i++)
	{
		fscanf(f,"%d %d",&a,&b);
		viz[a] ++;
		viz[b] ++;
		add(a,b);
		add(b,a);
	}
	
	fclose(f);
}

void adaugare(nod*& Ci,nod*& Cf)
{
	for(int i=1;i<=N;i++)
		if(viz[i] == 1)
		{
			nod *nou = (nod*)malloc(sizeof(nod));
			nou->info = i;
			nou->adr = Ci;
			Ci = nou;
		}
	Cf = Ci;
	while(Cf->adr)
		Cf = Cf->adr;
}

void add2(nod*& Cf,int a)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = a;
	nou->adr = NULL;
	Cf->adr = nou;
	Cf = nou;
}

void parc(void)
{
	int nr = 0;
	nod *Ci = NULL;
	nod *Cf = Cf;
	adaugare(Ci,Cf);
	while(nr<N-1)
	{
		if(grad[Ci->info] == viz[Ci->info]-1)
		{
			if(D[Ci->info]<0)
				D[Ci->info] = 0;
			viz[Ci->info] = -1;
			nod *q = A[Ci->info].cap;
			while(q)
			{
				if(viz[q->info] != -1)
				{
					D[q->info] += D[Ci->info];
					grad[q->info] ++;
					nr ++;
					add2(Cf,q->info);
				}
				q = q->adr;
			}
			Ci = Ci->adr;
		}
		else
		{
			nod *q = Ci;
			Ci = Ci->adr;
			q->adr = NULL;
			Cf->adr = q;
			Cf = q;
		}
	}
}

int main()
{
	FILE *g = fopen("asmax.out","w");
	
	citire();
	if(OK)
		parc();
	for(int i=1;i<=N;i++)
		if(MAX<D[i])
			MAX = D[i];
	fprintf(g,"%d",MAX);
	
	fclose(g);
	return 0;
}