造了几个大洋里没有过,还请dalao指教QAQ
把一个消防站想成一个强度为2的脉冲,每次强度减1。
dp[u][k],k∈[0,2] 表示以u为子树,u点的脉冲强度为k
dfs代码:
void dfs(int u,int fa){
dp[u][2]=1,dp[u][0]=0;
if(head[u]) dp[u][1]=0;
int mi1=inf,flag1=0;
int mi2=inf,flag2=0;
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==fa) continue;
dfs(v,u);
dp[u][2]+=min(dp[v][0],min(dp[v][1],dp[v][2]));
if(dp[v][1]<=dp[v][0]) dp[u][0]+=dp[v][1],flag1=1;
else dp[u][0]+=dp[v][0],mi1=min(mi1,-dp[v][0]+dp[v][1]);
int bb=min(dp[v][0],dp[v][1]);
if(dp[v][2]<=bb) dp[u][1]+=dp[v][2],flag2=1;
else dp[u][1]+=bb,mi2=min(mi2,-bb+dp[v][2]);
}
if(!flag1) dp[u][0]=min(dp[u][0]+mi1,inf);
if(!flag2) dp[u][1]=min(dp[u][1]+mi2,inf);
}