Pagini recente » Cod sursa (job #159252) | Cod sursa (job #3230673) | Cod sursa (job #1359449) | Cod sursa (job #2964578) | Cod sursa (job #43438)
Cod sursa(job #43438)
#include <fstream.h>
int a[205],ad[205][205],n,i,rez[5],x,y,viz[205],prec[205],prev[205],grades[205],parents[205],sp;
long long sumep[205],min,max,dmin=1000001;
ifstream fin("petrica.in");
ofstream fout("petrica.out");
int isparent(int i,int j)
{ if (ad[i][j]==2)
return 1;
return 0;
}
void compare()
{
int i,j;
min=1000001;
max=-1;
//1
sumep[1]-=sumep[rez[1]];
//2
if (isparent(rez[1],rez[2]))
sumep[rez[1]]-=sumep[rez[2]];
else
sumep[1]-=sumep[rez[2]];
//3
if (isparent(rez[2],rez[3]))
sumep[rez[2]]-=sumep[rez[3]];
else
if (isparent(rez[1],rez[3]))
sumep[rez[1]]-=sumep[rez[3]];
else
sumep[1]-=sumep[rez[3]];
if (sumep[1]<min)
min=sumep[1];
if (sumep[1]>max)
max=sumep[1];
if (sumep[rez[1]]<min)
min=sumep[rez[1]];
if (sumep[rez[1]]>max)
max=sumep[rez[1]];
if (sumep[rez[2]]<min)
min=sumep[rez[2]];
if (sumep[rez[2]]>max)
max=sumep[rez[2]];
if (sumep[rez[3]]<min)
min=sumep[rez[3]];
if (sumep[rez[3]]>max)
max=sumep[rez[3]];
if (max-min<dmin)
dmin=max-min;
for (i=1;i<=n;i++)
sumep[i]=prev[i];
}
void back(int k)
{
int i;
int x,y;
if (k==4)
{ compare();
return;
}
for (i=2;i<=n;i++)
if (grades[i]>grades[rez[k-1]])
{ rez[k]=i;
back(k+1);
}
else
if (grades[i]==grades[rez[k-1]]&&i>rez[k-1])
{ rez[k]=i;
back(k+1);
}
}
long long sume(char st,int sofar)
{ int i=0;
viz[st]=1;
grades[st]=sofar;
for (i=0;i<sp;i++)
ad[parents[i]][st]=2;
parents[sp++]=st;
for (i=1;i<=n;i++)
if (ad[st][i]==1&&viz[i]==0)
{ viz[i]=1;
prec[i]=st;
prev[st]=sumep[st]=sume(i,sofar+1)+sumep[st];
}
sp--;
return sumep[st];
}
int main()
{
fin>>n;
for (i=0;i<n;i++)
{fin>>a[i];
prev[i+1]=sumep[i+1]=a[i];
}
for (i=0;i<n-1;i++)
{fin>>x>>y;
ad[x][y]=1;
ad[y][x]=1;
}
sume(1,1);
back(1);
fout<<dmin<<'\n';
return 0;
}