7.25每日一题题解

树链博弈

涉及知识点:

  • 博弈论
  • DFS

solution

  • 假如每层的黑色节点数都为偶数的时候,那么先手是必败的
  • 如果先手选择一个黑点,不翻转他的祖先,那么后手和先手一样,状态是不变的。
  • 如果先手反转他的祖先,后手翻转对应层的祖先,状态还是不变的
  • 这样逐层消去,末状态为与根节点相连的黑点为偶数个,此时翻转祖先不改变结果,依次取黑,后手胜。
  • 否则,若有一层为奇数,则先手可以一步将所有层设为偶数,随后将后手代入上述推导,便是先手胜局

std:

#include <iostream>
#include <algorithm>
using namespace std;

#include <vector>

const int N = 1010;

vector<int>v[N];
int depth[N];
int a[N];
int ce;

void dfs(int u,int level,int fa)
{
    ce = max(ce,level);
    if(a[u]){
        depth[level]++;
    }
    for(auto &x : v[u])
    {
        if(x == fa) continue;
        dfs(x,level + 1,u);
    }
}

int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++)
    {
        cin >> a[i];
    }
    
    for(int i = 0;i < n - 1;i ++)
    {
        int a,b;
        cin >> a >> b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    
    dfs(1,1,-1);
    
    int flag = 0;
    
    for(int i = 1;i <= ce;i ++)
    {
        if(depth[i] & 1){
            flag = 1;
        }
    }
    
    if(!flag){
        cout << "Second" << endl;
    }
    else{
        cout << "First" << endl;
    }
    
    
    return 0;
}
posted @ 2020-07-25 16:31  QFNU-ACM  阅读(94)  评论(1编辑  收藏  举报