#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; #include using namespace atcoder; using ll = long long; using ld = long double; using bl = bool; using mint = modint998244353; // using mint = modint1000000007; // using mint = modint; // mint::set_mod(m); template using pq = priority_queue>; template using pq_g = priority_queue, greater>; using pii = pair; using pll = pair; #define rep(i, n) for (ll i = 0; i < (n); ++i) template istream& operator>>(istream& i, vector& v) { rep(j, size(v)) i >> v[j]; return i; } const int inf = 1073741823; const ll infl = 1LL << 60; #define rep(i, n) for (ll i = 0; i < (n); ++i) #define drep(i, n) for (ll i = (n) - 1; i >= 0; --i) #define nfor(i, s, n) for (ll i = s; i < n; i++) #define dfor(i, s, n) for (ll i = (s) - 1; i >= n; i--) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define chmax(x, y) x = max(x, y) #define chmin(x, y) x = min(x, y) #define Yes cout << "Yes" << endl #define No cout << "No" << endl #define YN \ { \ cout << "Yes" << endl; \ } \ else { \ cout << "No" << endl; \ } // if(a==b)YN; #define vc_unique(v) v.erase(unique(v.begin(), v.end()), v.end()); #define vc_rotate(v) rotate(v.begin(), v.begin() + 1, v.end()); #define pop_cnt(s) ll(popcount(uint64_t(s))) #define next_p(v) next_permutation(v.begin(), v.end()) vector dx = {1, 0, -1, 0}; // vl dx={1,1,0,-1,-1,-1,0,1}; vector dy = {0, 1, 0, -1}; // vl dy={0,1,1,1,0,-1,-1,-1}; bool out_grid(ll i, ll j, ll h, ll w = -1) { if (w == -1) { w = h; } return (!(0 <= i && i < h && 0 <= j && j < w)); } #define vvl_rotate(v) \ { \ ll n = size(v); \ vvl nx(n, vl(n)); \ rep(i, n) rep(j, n) nx[j][n - i - 1] = v[i][j]; \ swap(nx, v); \ } // 時計回りに90°回転 // #define vvl_rotate(v) {ll n = size(v);vvl // nx(n,vl(n));rep(i,n)rep(j,n)nx[n-j-1][i]=v[i][j];swap(nx,v);}//反時計周りに90°回転 #define vs_rotate(v) \ { \ ll n = size(v); \ vs nx(n, string(n, '.')); \ rep(i, n) rep(j, n) nx[j][n - i - 1] = v[i][j]; \ swap(nx, v); \ } // 文字列版 時計回りに90°回転 // #define vs_rotate(v) {ll n = size(v);vs // nx(n,string(n,'.'));rep(i,n)rep(j,n)nx[n-j-1][i]=v[i][j];swap(nx,v);}//文字列版 反時計周りに90°回転 #define vvl_transpos(v) \ { \ ll n = size(v); \ vvl nx(n, vl(n)); \ rep(i, n) rep(j, n) nx[j][i] = v[i][j]; \ swap(nx, v); \ } #define vs_transpos(v) \ { \ ll n = size(v); \ vs nx(n, string(n, '.')); \ rep(i, n) rep(j, n) nx[j][i] = v[i][j]; \ swap(nx, v); \ } #define euclid(x, y) ((x) * (x) + (y) * (y)) // ユークリッド距離 2乗のまま #define manhattan(x1, x2, y1, y2) \ (abs(x1 - x2) + abs(y1 - y2)) // マンハッタン距離 = |x1-x2|+|y1-y2| ll nc2(ll x) { return x * (x - 1) / 2; } ll nc3(ll x) { return x * (x - 1) * (x - 2) / 6; } //---------------------------------------------- //-----------6.デバックや出力系------------------ void print(ld x) { printf("%.20Lf\n", x); } #define print_vec(v) \ { \ ll n = size(v); \ rep(i, n) cout << v[i] << " "; \ cout << endl; \ } // 一次元配列を出力する(改行なし) #define vc_cout(v) \ { \ ll n = size(v); \ rep(i, n) cout << v[i] << endl; \ } // 一次元配列を出力する(改行あり) #define vv_cout(v) \ { \ ll n = size(v); \ rep(i, n) { \ rep(j, size(v[i])) { cout << v[i][j] << ' '; } \ cout << endl; \ } \ } // 二次元配列を出力する //---------------------------------------------- struct UnionFind { vector data; UnionFind(int N) : data(N, -1) {} int root(int k) { return data[k] < 0 ? k : data[k] = root(data[k]); } int merge(int x, int y) { if ((x = root(x)) == (y = root(y))) return false; if (data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; return true; } // f(x, y) : x に y をマージ template int merge(int x, int y, const F& f) { if ((x = root(x)) == (y = root(y))) return false; if (data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; f(x, y); return true; } int size(int k) { return -data[root(k)]; } int same(int x, int y) { return root(x) == root(y); } }; vector> G(100009); int main() { cout << fixed << setprecision(10); ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; cin >> n; UnionFind uf(n); rep(i, n - 1) { int u, v; cin >> u >> v; uf.merge(u, v); G[u].push_back(v), G[v].push_back(u); } if (uf.size(0) == n) cout << "Bob" << endl; else { bool f = true; rep(i, n) { if (uf.size(i) == 1) continue; if (G[i].size() != 2 || uf.size(i) < n - 1) f = false; } if (f) cout << "Bob" << endl; else cout << "Alice" << endl; } return 0; }