#include <bits/stdc++.h>
#define int long long
using namespace std;
int n , m , ans;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
struct node {
int to , next;
} e[N << 1];
int head[N << 1] , cnt = 0;
int siz[N] , val[N];
vector <int> p;
vector <int> q;
void add(int x , int y , int z = 1) {
e[++cnt].next = head[x];
e[cnt].to = y;
head[x] = cnt;
if(z)
add(y , x , 0);
}
void dfs(int u , int fa) {
siz[u] = 1;
for(int i = head[u]; i; i = e[i].next) {
int v = e[i].to;
if(v == fa)
continue;
dfs(v , u);
siz[u] += siz[v];
val[v] = siz[v] * (n - siz[v]);
}
}
inline void clear() {
cnt = 0;
ans = 0;
memset(siz , 0 , sizeof(siz));
memset(val , 0 , sizeof(val));
memset(head , 0 , sizeof(head));
p.clear();
q.clear();
}
main() {
int T;
cin >> T;
while(T--) {
clear();
cin >> n;
for(int i = 1; i < n; i++) {
int u , v;
cin >> u >> v;
add(u , v);
}
dfs(1 , 0);
cin >> m;
for(int i = 1; i <= m; i++) {
int x;
cin >> x;
p.push_back(x);
}
for(int i = 2; i <= n; i++)
q.push_back(val[i]);
if(m <= n - 1) {
for(int i = m + 1; i < n; i++)
p.push_back(1);
sort(p.begin() , p.end());
} else {
int mul = 1;
sort(p.begin() , p.end());
for(int i = n - 1; i <= m; i++)
mul = (mul * p[i - 1]) % mod;
p[n - 2] = mul;
p.erase(p.begin() + n - 1 , p.end());
}
sort(p.begin() , p.end());
sort(q.begin() , q.end());
for(int i = 0; i < n - 1; i++)
ans = (ans + p[i] % mod * q[i] % mod) % mod;
cout << ans << endl;
}
}
rt,思路是处理每条边经过的次数,贪心的取较优的因子,根据排序不等式统计答案,WA on #46
请问是这个做法有问题还是我写错了