本蒟蒻自己想的方法,非常好,哈哈哈哈哈哈哈
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,u,v,num;
struct edge{
int next;
int to;
} a[2000000];//注意数组的大小,就OK了
int head[2000000],w[200006],max5,sum;
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
cin>>u>>v;
num++;
a[num].next=head[u];//邻接表
a[num].to=v;
head[u]=num;
num++;
a[num].next=head[v];
a[num].to=u;
head[v]=num;
}
for(int i=1;i<=n;i++)
cin>>w[i];
for(int i=1;i<=n;i++)
{int max1=0,max2=0,s=0;
for(int j=head[i];j!=0;j=a[j].next)
{
if(w[a[j].to]>max1)
{
max2=max1;
max1=w[a[j].to];
}
else if(w[a[j].to]>max2)
max2=w[a[j].to];
sum=(sum+s*w[a[j].to])%10007;
s=(s+w[a[j].to])%10007;
max5=max(max5,max1*max2);
}
}
sum=(2*sum)%10007;
cout<<max5<<" "<<sum;
return 0;
}