#include #include #define rep(i, n) for(i = 0; i < n; i++) using namespace std; int n; vector et[200000]; //edge to int m; bool ghost[200000]; //ghost[v] = 頂点vにおばけがいるか int safe_cnt[200000]; //safe_cnt[u] = 頂点uで除霊をおこなったときに、魔の手から逃れられる街の数 int all_add; //add_add = 全頂点uについてsafe_cnt[u] += 1する回数 int add_query[200000]; //add_query[v] = 頂点vから距離1以内の頂点uについてsafe_cnt[u]++する操作をおこなう回数 int main() { int i, j; cin >> n; rep(i, n - 1) { int a, b; cin >> a >> b; a--; b--; et[a].push_back(b); et[b].push_back(a); } cin >> m; rep(i, m) { int v; cin >> v; v--; ghost[v] = true; } rep(i, n) { int black = 0, black_v = -1; rep(j, et[i].size()) { if (ghost[et[i][j]]) { black++; black_v = et[i][j]; } } if (black >= 2) { safe_cnt[i]++; } if (black == 1) { if (ghost[i]) { safe_cnt[i]++; safe_cnt[black_v]++; } else { add_query[black_v]++; } } if (black == 0) { if (ghost[i]) { add_query[i]++; } else { all_add++; } } } rep(i, n) { safe_cnt[i] += add_query[i]; rep(j, et[i].size()) { safe_cnt[et[i][j]] += add_query[i]; } safe_cnt[i] += all_add; } rep(i, n) { cout << n - safe_cnt[i] << endl; } return 0; }