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 @   w9095  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示