atcoder D

题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_d

题解:简单的树上的尼姆博弈,这个应该看的出来然后就是简单的树形dp然后异或一下就行。

#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
const int M = 1e5 + 10;
vector<int>vc[M];
int dp[M];
int dfs(int u , int pre) {
    int len = vc[u].size();
    for(int i = 0 ; i < len ; i++) {
        int v = vc[u][i];
        if(v == pre) continue;
        dp[u] ^= (dfs(v , u) + 1);
    }
    return dp[u];
}
int main() {
    int n;
    scanf("%d" , &n);
    for(int i = 1 ; i < n ; i++) {
        int u , v;
        scanf("%d%d" , &u , &v);
        vc[u].push_back(v);
        vc[v].push_back(u);
    }
    memset(dp , 0 , sizeof(dp));
    if(dfs(1 , -1)) printf("Alice
");
    else printf("Bob
");
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/7149946.html