Problem:
Score : 1100 points

Problem Statement

There is a tree with N vertices numbered 1, 2, ..., N.
The edges of the tree are denoted by (x_i, y_i).

On this tree, Alice and Bob play a game against each other.
Starting from Alice, they alternately perform the following operation:

Select an existing edge and remove it from the tree, disconnecting it into two separate connected components. Then, remove the component that does not contain Vertex 1.

A player loses the game when he/she is unable to perform the operation.
Determine the winner of the game assuming that both players play optimally.

Constraints

2 \leq N \leq 100000

1 \leq x_i, y_i \leq N

The given graph is a tree.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
x_2 y_2
:
x_{N-1} y_{N-1}

Output

Print Alice if Alice wins; print Bob if Bob wins.

Sample Input 1

5
1 2
2 3
2 4
4 5

Sample Output 1

Alice

If Alice first removes the edge connecting Vertices 1 and 2, the tree becomes a single vertex tree containing only Vertex 1.
Since there is no edge anymore, Bob cannot perform the operation and Alice wins.

Sample Input 2

5
1 2
2 3
1 4
4 5

Sample Output 2

Bob

Sample Input 3

6
1 2
2 4
5 1
6 3
3 2

Sample Output 3

Alice

Sample Input 4

7
1 2
3 7
4 6
2 3
2 4
1 5

Sample Output 4

Bob

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define pb push_back
#define mp make_pair
#define F first
#define S second

typedef long long ll;

const int MAX_SIZE = 1e5 + 10;

vector<int> graph[MAX_SIZE];
vector<bool> visited(MAX_SIZE);

ll dfs(int a)
{
	visited[a] = true;
	vector<ll> G;
	for(auto &u : graph[a])
	{
		if(!visited[u])
		{
			G.pb(dfs(u));
		}
	}
	if(G.size() == 1)
		return 1 + G[0];
	else if(G.size() == 0)
		return 0;
	ll s = 0;
	for(auto &g : G)
	{
		s ^= g;
	}
	return s;
}

int main()
{
	int N;
	cin >> N;
	int x, y;
	for(int i = 1; i < N; i++)
	{
		cin >> x >> y;
		graph[x].pb(y);
		graph[y].pb(x);
		visited[x] = false;
		visited[y] = false;
	}
	ll s = dfs(1);
	if(s == 0)
		cout << "Bob" << endl;
	else
		cout << "Alice" << endl;
	return 0;
}