#include #include #include #include #include #include #include #include using namespace std; int N; int A[1 << 18], B[1 << 18]; int depth[1 << 18]; vector X[1 << 18]; void dfs(int pos, int dep) { depth[pos] = dep; for (int i : X[pos]) { if (depth[i] != -1) continue; dfs(i, dep + 1); } } int main() { // Step #1. 入力 cin >> N; for (int i = 1; i <= N - 1; i++) cin >> A[i] >> B[i]; for (int i = 1; i <= N - 1; i++) X[A[i]].push_back(B[i]); for (int i = 1; i <= N - 1; i++) X[B[i]].push_back(A[i]); // Step #2. 前処理 int idx = -1, cnt = 0; for (int i = 1; i <= N; i++) { if (X[i].size() >= 3) { idx = i; cnt++; } } if (cnt >= 2) { cout << "No" << endl; return 0; } if (cnt == 0) { cout << "Yes" << endl; return 0; } // Step #3. 深さ優先探索 for (int i = 1; i <= N; i++) depth[i] = -1; dfs(idx, 0); // Step #4. 判定 vector vec; for (int i = 1; i <= N; i++) { if (X[i].size() == 1) vec.push_back(depth[i]); } sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end()); // Step #5. 出力 if (vec.size() == 1) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; }