变成这样惹
#include <bits/stdc++.h>
using namespace std;
#define N 200005
#define R register
#define mod 10007
struct edge{
int nx, to;
};
int n, Max, ans, w[N], g[N][2], f[N][2];//0 -> son ; 1 -> son's son
int len, head[N];
edge e[N*2];
inline void read(int &x){
x = 0; bool f(0); char c = getchar();
while( c < '0'||'9' < c ){if(c == '-') f = 1; c = getchar();}
while('0' <= c&&c <= '9') x = (x << 1) + (x << 3) + c-'0', c = getchar();
x= f ? -x : x;
}
inline void add(int u,int v){
e[++len] = (edge){head[u], v};
head[u] = len;
}
inline int ADD(int x,int y){return (1ll * x + y) % mod;}
inline int MUL(int x,int y){return 1ll * x * y % mod;}
void dfs(int x,int fa){
for(R int i(head[x]) ; i ; i=e[i].nx){
int y(e[i].to);
if(y == fa) continue;
dfs(y,x);
ans = ADD(ans, MUL(g[x][0], w[y]));
Max = max(Max, f[x][0] * w[y]);
f[x][0] = max(f[x][0], w[y]);
f[x][1] = max(f[x][1], f[y][0]);
g[x][0] = ADD(g[x][0], w[y]);
g[x][1] = ADD(g[x][1], g[y][0]);
}
ans = ADD(ans, MUL(g[x][1], w[x]));
Max = max(Max, f[x][1] * w[x]);
}
int main(){
read(n);
for(R int i(1) ; i < n ; ++i){
int u,v;
read(u), read(v);
add(u,v), add(v,u);
}
for(R int i(1) ; i <= n ; ++i) read(w[i]);
dfs(1,0);
printf("%d %d\n", Max, MUL(ans, 2));
return 0;
}