#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
const int MAX = 2e5 + 10;
int n, m;
int x, y;
vector <int> veze[MAX];
vector <vector<int>> v;
int rek(int pos, int last) {
if (pos == y) {
v.back().push_back(pos);
return 1;
}
for (auto e : veze[pos]) {
if (e == last) continue;
if (rek(e, pos)) {
v.back().push_back(pos);
return 1;
}
}
return 0;
}
void input() {
cin >> n;
for (int i = 0; i <= n; i++) {
veze[i].clear();
}
for (int i = 0; i < n - 1; i++) {
cin >> x >> y;
veze[x].push_back(y);
veze[y].push_back(x);
}
v.clear();
cin >> m;
for (int i = 0; i < m; i++) {
cin >> x >> y;
v.push_back({});
rek(x, -1);
reverse(v.back().begin(), v.back().end());
}
}
int good(vector<int> a, vector<int> b, vector<int> c) {
/// ---------- 1. ----------
int imaPoc = false, imaKraj = false;
for (auto e : a) {
if (e == b[0]) imaPoc = true;
if (e == b.back()) imaKraj = true;
}
if (imaPoc && imaKraj) return false;
/// ------------------------
/// ---------- 2. ----------
int prijedePoc = false;
for (auto e : a) if (e == b[0]) prijedePoc = true;
int prijedePoc2 = false;
for (auto e : b) if (e == a[0]) prijedePoc2 = true;
if (prijedePoc && prijedePoc2) return false;
/// ------------------------
/// ---------- 3. ----------
int dosoA = -1, pocc;
for (int i = 0; i < (int)a.size(); i++) {
if (a[i] != c[0]) continue;
pocc = i;
for (int j = i; j >= 0; j--) {
if (a[j] == c[dosoA + 1]) dosoA++;
}
break;
}
int dosoB = c.size(), pocc2;
for (int i = 0; i < (int)b.size(); i++) {
if (b[i] != c.back()) continue;
pocc2 = i;
for (int j = i; j >= 0; j--) {
if (b[j] == c[dosoB - 1]) dosoB--;
}
break;
}
if (dosoA + 1 >= dosoB && dosoA == pocc && dosoB == pocc2) return false;
/// ------------------------
/// ---------- 4. ----------
dosoA = -1, pocc = 0;
for (int i = 0; i < (int)a.size(); i++) {
if (a[i] != c[0]) continue;
pocc = i;
for (int j = i; j < a.size(); j++) {
if (a[j] == c[dosoA + 1]) dosoA++;
}
break;
}
dosoB = c.size(), pocc2 = 0;
for (int i = 0; i < (int)b.size(); i++) {
if (b[i] != c.back()) continue;
pocc2 = i;
for (int j = i; j < b.size(); j++) {
if (b[j] == c[dosoB - 1]) dosoB--;
}
break;
}
if (dosoA + 1 >= dosoB && dosoA == (a.size() - pocc) && dosoB == (b.size() - pocc2)) return false;
/// ------------------------
return true;
}
void solve() {
input();
// cout << "v:\n";
// for (auto e : v) {
// for (auto e2 : e) cout << e2 << " "; cout << "\n";
// }
// cout << "\n";
bool sol = true;
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
if (i == j) continue;
for (int k = 0; k < m; k++) {
if (i == k) continue;
if (j == k) continue;
if (!good(v[i], v[j], v[k])) sol = false;
}
}
}
if (sol) cout << "Yes\n";
else cout << "No\n";
}
int main() {
// ios_base::sync_with_stdio(0);
// cin.tie(0);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |