#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<vector<int>> edges(n + 1); for (int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; edges[u].push_back(v); edges[v].push_back(u); } // 构建子节点列表 vector<int> parent(n + 1, 0); vector<vector<int>> children(n + 1); queue<int> q; q.push(1); parent[1] = 0; while (!q.empty()) { int u = q.front(); q.pop(); for (int v : edges[u]) { if (v != parent[u]) { parent[v] = u; children[u].push_back(v); q.push(v); } } } int k; cin >> k; vector<int> V(k); for (int i = 0; i < k; ++i) { cin >> V[i]; } // 标记是否在集合 V 中 vector<int> is_in_V(n + 1, 0); for (int node : V) { is_in_V[node] = 1; } // 计算 s 数组 vector<long long> s(n + 1, 0); vector<pair<int, bool>> stack; stack.emplace_back(1, false); while (!stack.empty()) { auto [node, visited] = stack.back(); stack.pop_back(); if (!visited) { stack.emplace_back(node, true); // 逆序压入子节点以保证处理顺序正确 for (auto it = children[node].rbegin(); it != children[node].rend(); ++it) { stack.emplace_back(*it, false); } } else { long long s_val = is_in_V[node]; for (int child : children[node]) { s_val += s[child]; } s[node] = s_val; } } // 计算 cnt 数组 vector<long long> cnt(n + 1, 0); for (int i = 1; i <= n; ++i) { long long total = s[i] * s[i]; long long sum_child = 0; for (int child : children[i]) { sum_child += s[child] * s[child]; } cnt[i] = total - sum_child; } // 输出结果 for (int i = 1; i <= n; ++i) { cout << cnt[i] << ' '; } return 0; }