Pagini recente » Cod sursa (job #2297081) | Cod sursa (job #2412826) | Cod sursa (job #501734) | Cod sursa (job #764035) | Cod sursa (job #927105)
Cod sursa(job #927105)
/*
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);
}
}
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()
{
citire();
DF(1,0);
int maxx=-100000;
for (int i=1;i<=n;i++) if (maxx<v[i]) maxx=v[i];
printf ("%d",maxx);
return 0;
}