Atcoders [AGC014D] Black and White Tree 题解
AT_agc014_d [AGC014D] Black and White Tree
我们充分发扬人类智慧。
不难发现如果树根确定的情况下,先手会从叶子的父亲开始填,如果填到某两棵子树的白点中刚好是同一个节点,我们就可以直接填这个节点,这样两个儿子中至少有一个被完全白点阻隔,先手获胜。
考虑到树根是不确定的,我们枚举树根,每次暴力判定。注意到枚举度数为 \(1\) 的点是不优的,于是取度数大于 \(1\) 的前 \(100\) 个点枚举就过了。
如果之后被卡了就该位随机选度数大于 \(1\) 的点,应该还是能够过的。
#include <bits/stdc++.h>
using namespace std;
struct edge
{
long long v,nxt;
}e[300000];
long long n,u,v,h[300000],ind[300000],flag=0,cnt=0;
void add_edge(long long u,long long v)
{
e[++cnt].nxt=h[u];
e[cnt].v=v;
h[u]=cnt;
ind[u]++;
}
long long dfs(long long x,long long fa)
{
long long ans=0;
for(int i=h[x];i;i=e[i].nxt)
if(e[i].v!=fa)ans+=dfs(e[i].v,x);
if(ans>1)flag=1;
return (ans!=1);
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n-1;i++)scanf("%lld%lld",&u,&v),add_edge(u,v),add_edge(v,u);
long long num=0;
for(int i=1;i<=n;i++)
if(ind[i]>1)
{
num++,dfs(i,0);
if(num>100)break;
}
if(flag)printf("First\n");
else printf("Second\n");
return 0;
}

浙公网安备 33010602011771号