涉及知识点:
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;
}