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;
}
posted @ 2025-02-21 08:03  w9095  阅读(22)  评论(0)    收藏  举报