Atcoders [AGC014D] Black and White Tree 题解
AT_agc014_d [AGC014D] Black and White Tree
我们充分发扬人类智慧。
不难发现如果树根确定的情况下,先手会从叶子的父亲开始填,如果填到某两棵子树的白点中刚好是同一个节点,我们就可以直接填这个节点,这样两个儿子中至少有一个被完全白点阻隔,先手获胜。
考虑到树根是不确定的,我们枚举树根,每次暴力判定。注意到枚举度数为 的点是不优的,于是取度数大于 的前 个点枚举就过了。
如果之后被卡了就该位随机选度数大于 的点,应该还是能够过的。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探