Cod sursa(job #927118)

Utilizator BumpiliciFoloba Anca Bumpilici Data 25 martie 2013 16:29:26
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
/*
Se considera un arbore (graf neorientat, conex si aciclic)
cu N varfuri, in care fiecare varf i are asociata o valoarea
intreaga Vi. Se defineste un subarbore al arborelui dat, ca
fiind un subgraf conex nevid al acestuia (care poate coincide
chiar cu arborele dat).
Se cere sa determinati un subarbore al unui arbore dat, pentru
care suma valorilor asociate varfurilor continute in subarbore
sa fie maxima.

asmax.in
5
-1 1 3 1 -1
4 1
1 3
1 2
4 5

asmax.out
4

*/

#include<stdio.h>
#define MAX 16001

int v[MAX];
char viz[MAX];
int n;

struct lista
{
    int nod;
    lista *urm;
};

lista *G[MAX];

void adauga(int x, int y)
{
	lista *p, *q, *r;
	q=new lista;
	q->nod=y;
	q->urm=0;
	if(!G[x]) G[x]=q;
	else
	{
		p=r=G[x];
		while(p && p->nod<y)
		{
			r=p;
			p=p->urm;
		}
		if(p==G[x])
		{
			q->urm=p;
			G[x]=q;
		}
		else
		{
		    if (!p) r->urm=q;
		    else
            {
                r->urm=q;
                q->urm=p;
            }
		}
	}
}

void citire()
{
    FILE *f=fopen("asmax.in","r");
    fscanf (f,"%d",&n);
    for (int i=1;i<=n;i++) fscanf (f,"%d",&v[i]);
    for (int i=1;i<=n-1;i++)
    {
        int x;
        int y;
        fscanf (f,"%d%d",&x,&y);
        adauga(x,y);
        adauga(y,x);
    }
	fclose(f);
}

void afisare()
{
    lista *p;
    p=new lista;
    for (int i=1;i<=n;i++)
    {
        printf ("%d: ",i);
        for (p=G[i];p;p=p->urm) printf ("%d ",p->nod);
        printf ("\n");
    }
}

void DF(int x,int t)
{
    viz[x]=1;
    for (lista *p=G[x];p;p=p->urm)
    {
        if (!viz[p->nod])
        {
            DF(p->nod,x);
            if (v[p->nod]>0) v[x]+=v[p->nod];
        }
    }
}

int main()
{
	FILE *g=fopen("asmax.out","w");
    citire();
    DF(1,0);
    int maxx=-100000;
    for (int i=1;i<=n;i++) if (maxx<v[i]) maxx=v[i];
    fprintf (g,"%d",maxx);
	fclose(g);
    return 0;
}