Pagini recente » Cod sursa (job #3287577) | Cod sursa (job #3232545) | Cod sursa (job #2653256) | Cod sursa (job #345318) | Cod sursa (job #586379)
Cod sursa(job #586379)
#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;
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]);
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();
parc();
for(int i=1;i<=N;i++)
if(MAX<D[i])
MAX = D[i];
fprintf(g,"%d",MAX);
fclose(g);
return 0;
}