UCPC 18 예선 D번
성원이가 게임에서 이길 수 있는 경우는 트리의 리프 노드들의 깊이의 합이 홀수인 경우이다
#include <iostream>
#include <vector>
using namespace std;
//트리의 리프 노드들의 깊이의 합
int sum = 0;
vector<vector<int>> edge (500001);
int visited[500001] = { 0 };
void dfs(int node, int depth) {
//리프노드 만나면 종료
//간선의 수 1개인 노드 = 리프 노드
if (node != 1 && edge[node].size() == 1) {
sum += depth;
return;
}
visited[node] = 1;
for(int i = 0; i<edge[node].size(); ++i){
if (!visited[edge[node][i]])
dfs(edge[node][i], depth + 1);
}
return;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
for (int i = 1; i < n; ++i) {
int a, b;
cin >> a >> b;
edge[a].push_back(b);
edge[b].push_back(a);
}
//루트 노드부터 DFS
dfs(1, 0);
//sum 홀수인 경우 성원이 승리
if (sum % 2) cout << "Yes";
else cout << "No";
return 0;
}