#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; // BEGIN NO SAD #define rep(i, a, b) for(int i = a; i < (b); ++i) #define trav(a, x) for(auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define eb emplace_back #define lb lower_bound #define ub upper_bound typedef vector vi; #define f first #define s second #define derr if(1) cerr // END NO SAD template class y_combinator_result { Fun fun_; public: template explicit y_combinator_result(T &&fun): fun_(std::forward(fun)) {} template decltype(auto) operator()(Args &&...args) { return fun_(std::ref(*this), std::forward(args)...); } }; template decltype(auto) y_combinator(Fun &&fun) { return y_combinator_result>(std::forward(fun)); } template bool updmin(T& a, T b) { if(b < a) { a = b; return true; } return false; } template bool updmax(T& a, T b) { if(b > a) { a = b; return true; } return false; } typedef long long ll; typedef pair pii; typedef pair pll; typedef vector> matrix; void solve() { int t; cin >> t; while(t--) { int n; cin >> n; vector start(n, -1); vector nextID(2*n-2); vector to(2*n-2); for(int i = 0; i+1 < n; i++) { int a, b; cin >> a >> b; a--; b--; to[2*i] = b; nextID[2*i] = start[a]; start[a] = 2*i; to[2*i+1] = a; nextID[2*i+1] = start[b]; start[b] = 2*i+1; } vector dp(n); vector q(n); auto bfs = [&](int src) -> int { fill(all(dp), 1e9); int ql = 0; int qr = 0; dp[src] = 0; q[qr++] = src; while(ql < qr) { src = q[ql++]; for(int id = start[src]; id != -1; id = nextID[id]) { int out = to[id]; if(updmin(dp[out], dp[src]+1)) q[qr++] = out; } } return src; }; int x = bfs(bfs(0)); vector p(n); for(auto& xx: p) { cin >> xx; xx--; } if(dp[x] <= 3) { cout << "1\n"; continue; } vector dist(n); vector currid(n, -1); vector color(n); int ret = 1; for(int i = 0; ret && i + 1 < n; i++) { int ql = 0; int qr = 0; q[qr++] = p[i]; q[qr++] = p[i+1]; currid[p[i]] = i; currid[p[i+1]] = i; color[p[i]] = 0; color[p[i+1]] = 1; dist[p[i]] = 0; dist[p[i+1]] = 0; bool good = false; while(ql < qr && !good) { int curr = q[ql++]; for(int id = start[curr]; !good && id != -1; id = nextID[id]) { int out = to[id]; if(currid[out] == i && color[out] != color[curr]) { good = true; break; } if(currid[out] != i) { dist[out] = dist[curr] + 1; color[out] = color[curr]; currid[out] = i; if(dist[out] == 1 && color[out] == 0) q[qr++] = out; } } } if(!good) ret = 0; } cout << ret << "\n"; } } int main() { //ios_base::sync_with_stdio(false); //cin.tie(NULL); solve(); }