#include <iostream>
#include <vector>
using namespace std;
const int MAX_N = 307;
const long long inf = ((long long)1) << 62;
vector<int>adj[MAX_N];
long long a[MAX_N];
int parent[MAX_N], visited[MAX_N], n, t;
void ReadData(), PreDFS(int x, int p);
long long GetMin(int index, int current, int maxAmount), Check(), DFS(int x);
int main() {
ios_base::sync_with_stdio(0);
cin >> t;
while(t--) {
ReadData();
PreDFS(0, -1);
for(int i = 0; i < n; i++)
cout << GetMin(1, 0, i) << ' ';
cout << '\n';
}
return 0;
}
long long GetMin(int index, int current, int maxAmount) {
if(index == n)
return Check();
long long result = inf;
if(current < maxAmount) {
visited[index] = 2;
result = GetMin(index + 1, current + 1, maxAmount);
}
if(n - index > maxAmount - current) {
visited[index] = 0;
result = min(result, GetMin(index + 1, current, maxAmount));
}
return result;
}
long long Check() {
long long result = 0;
visited[0] = 2;
for(int i = 1; i < n; i++)
if(visited[i] != 2)
visited[i] = 0;
for(int i = 0; i < n; i++) {
if(visited[i] == 2) {
long long temp = DFS(i);
result += temp * temp;
}
}
return result;
}
long long DFS(int x) {
if(visited[x] != 2)
visited[x] = 1;
long long result = a[x];
for(int y : adj[x])
if(visited[y] == 0 && y != parent[x])
result += DFS(y);
return result;
}
void PreDFS(int x, int p) {
visited[x] = 1;
parent[x] = p;
for(int y : adj[x])
if(!visited[y])
PreDFS(y, x);
}
void ReadData() {
int x, y;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
adj[i].clear();
visited[i] = false;
}
for(int i = 1; i < n; i++) {
cin >> x >> y;
adj[x - 1].push_back(y - 1);
adj[y - 1].push_back(x - 1);
}
}
/*
2
7
9 1 4 2 6 4 7
1 7
6 4
2 3
5 7
3 4
5 3
5
4 8 2 3 1
4 3
3 1
4 2
5 1
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> #include <vector> using namespace std; const int MAX_N = 307; const long long inf = ((long long)1) << 62; vector<int>adj[MAX_N]; long long a[MAX_N]; int parent[MAX_N], visited[MAX_N], n, t; void ReadData(), PreDFS(int x, int p); long long GetMin(int index, int current, int maxAmount), Check(), DFS(int x); int main() { ios_base::sync_with_stdio(0); cin >> t; while(t--) { ReadData(); PreDFS(0, -1); for(int i = 0; i < n; i++) cout << GetMin(1, 0, i) << ' '; cout << '\n'; } return 0; } long long GetMin(int index, int current, int maxAmount) { if(index == n) return Check(); long long result = inf; if(current < maxAmount) { visited[index] = 2; result = GetMin(index + 1, current + 1, maxAmount); } if(n - index > maxAmount - current) { visited[index] = 0; result = min(result, GetMin(index + 1, current, maxAmount)); } return result; } long long Check() { long long result = 0; visited[0] = 2; for(int i = 1; i < n; i++) if(visited[i] != 2) visited[i] = 0; for(int i = 0; i < n; i++) { if(visited[i] == 2) { long long temp = DFS(i); result += temp * temp; } } return result; } long long DFS(int x) { if(visited[x] != 2) visited[x] = 1; long long result = a[x]; for(int y : adj[x]) if(visited[y] == 0 && y != parent[x]) result += DFS(y); return result; } void PreDFS(int x, int p) { visited[x] = 1; parent[x] = p; for(int y : adj[x]) if(!visited[y]) PreDFS(y, x); } void ReadData() { int x, y; cin >> n; for(int i = 0; i < n; i++) { cin >> a[i]; adj[i].clear(); visited[i] = false; } for(int i = 1; i < n; i++) { cin >> x >> y; adj[x - 1].push_back(y - 1); adj[y - 1].push_back(x - 1); } } /* 2 7 9 1 4 2 6 4 7 1 7 6 4 2 3 5 7 3 4 5 3 5 4 8 2 3 1 4 3 3 1 4 2 5 1 */ |
English