见识了好多乱搞神仙
我是用树形DP做的 设dp[i]表示在i点的子树放多少个守卫
显然 有方程
if(mind[i]-(depth[i]-1)<=depth[i]) (其中mind表示i的子树内的叶子节点最浅的深度) dp[i]=1 即守卫可以抓到这个人
else dp[i]=Sigma{dp[i.son]}
#include<bits/stdc++.h>
const int N=100005;
using namespace std;
template<class T>
inline void read(T &x)
{
x=0;
static char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
}
int n,root;
struct Edge
{
int to,next;
}edge[2*N];
int first[N],tot;
inline void addedge(int x,int y)
{
tot++;
edge[tot].to=y; edge[tot].next=first[x]; first[x]=tot;
}
int depth[N],mind[N],son[N],dp[N]; //dp[i]:在i点的子树放多少个守卫
void dfs1(int now,int fa)
{
son[now]=1;
depth[now]=depth[fa]+1;
for(int u=first[now];u;u=edge[u].next)
{
int vis=edge[u].to;
if(vis==fa) continue;
dfs1(vis,now);
son[n