题目描述大概就是有一棵树,树上有n个节点,节点的颜色可以是黑色的也可以是白色的,你一次选择一个黑色的节点
同时你也是可以选择除了这个节点之外的他的任意一个祖先节点,将所有的节点颜色翻转当某一个人不能进行操作的时
候,这个人就输了
我当时没有推算出来,感觉跟树的DFS序列是有关联的,但是并没有想到就是看所有层的黑色节点的个数是不是偶数
如果所有的层都是有这样的特点的话,那么后手是一定可以赢得,但是只要有一层是黑点的个数不是偶数个的话就会有
先手赢;
树链博弈的详细讲解
http://www.cnblogs.com/lxm940130740/p/3268005.html
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Max = 3e6+10;
vector <int> ma[Max];
int du[Max],deep[Max];
bool visited[Max];
int color[Max];
int n;
#define rep(i,s,n) for(int i=s;i<=n;i++)
#define per(i,n,s) for(int i=n;i>=s;i--)
void DFS(int u, int dp){
deep[u]=dp;
visited[u]=true;
int len=ma[u].size();
rep(i,0,len-1){
int to=ma[u][i];
if(!visited[to]){
DFS(to,++dp);
dp--;
}
}
}
int main(){
scanf("%d",&n);
rep(i,1,n){
scanf("%d",&color[i]);
}
int u,v;
rep(i,1,n-1){
scanf("%d %d",&u,&v);
ma[u].push_back(v);
ma[v].push_back(u);
}
DFS(1,1);
bool ok=1;
rep(i,1,n){
if(color[i]){
du[deep[i]]++;
}
}
rep(i,1,n){
if(du[i]%2==1){
ok=0;
break;
}
}
if(ok){
printf("Second\n");
}
else{
printf("First\n");
}
return 0;
}