D - Black and White Tree
Time limit : 2sec / Memory limit : 256MB
Score : 900 points
Problem Statement
There is a tree with N vertices numbered 1 through N. The i-th of the N?1 edges connects vertices ai and bi.
Initially, each vertex is uncolored.
Takahashi and Aoki is playing a game by painting the vertices. In this game, they alternately perform the following operation, starting from Takahashi:
- Select a vertex that is not painted yet.
- If it is Takahashi who is performing this operation, paint the vertex white; paint it black if it is Aoki.
Then, after all the vertices are colored, the following procedure takes place:
- Repaint every white vertex that is adjacent to a black vertex, in black.
Note that all such white vertices are repainted simultaneously, not one at a time.
If there are still one or more white vertices remaining, Takahashi wins; if all the vertices are now black, Aoki wins. Determine the winner of the game, assuming that both persons play optimally.
Constraints
- 2???N???105
- 1???ai,bi???N
- ai???bi
- The input graph is a tree.
Input
Input is given from Standard Input in the following format:
N a1 b1 : aN?1 bN?1
Output
Print First
if Takahashi wins; print Second
if Aoki wins.
Sample Input 1
3 1 2 2 3
Sample Output 1
First
Below is a possible progress of the game:
- First, Takahashi paint vertex 2 white.
- Then, Aoki paint vertex 1 black.
- Lastly, Takahashi paint vertex 3 white.
In this case, the colors of vertices 1, 2 and 3 after the final procedure are black, black and white, resulting in Takahashi???s victory.
Sample Input 2
4 1 2 2 3 2 4
Sample Output 2
First
Sample Input 3
6 1 2 2 3 3 4 2 5 5 6
Sample Output 3
Second
??????????????????????????????????????????
???????????????
/* f[x]?????????x???????????????????????????x??????????????????????????????????????????x??????????????? g[x]?????????x??????????????????????????????????????????????????? ??????????????????????????????root??????????????????????????????g[root]=1. ?????????(????????????)??? g[x]=1; f[x]=0; ????????? 1.f[x]?????????????????????g????????? ???????????????????????????????????????????????????g???1?????????????????????x????????? ??????????????????g???1????????????????????????????????????????????? 2.g[x]?????????????????????f????????? ???????????????????????????????????????????????????f??????1???????????????????????????????????????????????? ?????????????????????????????????x??????????????????hhhh ???????????????????????????????????????????????? ???????????????????????????????????? ?????????dfs????????????????????????????????????????????? ?????????dfs???????????????O(1)????????????????????? */ #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> #define ll long long #define maxn 100005 #define pb push_back using namespace std; vector<int> son[maxn]; int n,m,g[maxn]; int f[maxn]; bool win=0; void dfs1(int x,int fa){ int sz=son[x].size()-1,to; f[x]=0,g[x]=1; for(int i=0;i<=sz;i++){ to=son[x][i]; if(to==fa) continue;; dfs1(to,x); f[x]|=g[to],g[x]&=f[to]; } } void dfs2(int x,int fa,int fa_f,int fa_g){ int sz=son[x].size()-1,to; int hzf[sz+2],hzg[sz+2]; hzf[sz+1]=1,hzg[sz+1]=0; if(g[x]&fa_f) win=1; for(int i=sz;i>=0;i--){ hzf[i]=hzf[i+1]; hzg[i]=hzg[i+1]; to=son[x][i]; if(to==fa) continue; hzf[i]&=f[to]; hzg[i]|=g[to]; } for(int i=0;i<=sz;i++){ to=son[x][i]; if(to==fa) continue; dfs2(to,x,fa_g|hzg[i+1],fa_f&hzf[i+1]); fa_g|=g[to]; fa_f&=f[to]; } } int main(){ int uu,vv; scanf("%d",&n); for(int i=1;i<n;i++){ scanf("%d%d",&uu,&vv); son[uu].pb(vv); son[vv].pb(uu); } dfs1(1,0); dfs2(1,0,1,0); if(win) puts("First"); else puts("Second"); return 0; }
??????