题解 P3942 【将军令】
此题有
把驿站看做节点,则整张图就是一颗树,假设
令
这意味着当
核心代码:
int dfs(int node)
{
vis[node]=1;
int res1=-1,temp=-1;
int res2=99999999; res1表示最大值,res2表示最小值。
for(int i=first[node];i!=-1;i=next[i]){
if(vis[to[i]]==1)
continue;
temp=dfs(to[i]);
遍历子节点,求最大最小值。
if(res1<temp)
res1=temp;
if(res2>temp)
res2=temp;
}
if(res1==2*k||(node==1&&res1+res2>=2*k)){
ans++;
return 0; 如果不驻扎军队,则有节点控制不到。
}
if(temp==-1)
return k+1; 该节点是叶子节点。
if(res1+res2<2*k)
return res2+1;
return res1+1;
在这里计算f(x)值,并返回。
具体的计算方法请读者自己思考。
f(x)的意义比较难理解,即使理解了,写起来也很容易出错。
在考场上遇到这种题还是不要尝试O(n)算法。
毕竟O(nk)算法也能过。
}