当前位置:   article > 正文

[洛谷]P2016 战略游戏(树形dp)

p2016 战略游戏

树形结构!!!

因为是一棵树,所以对于每个节点,我们都把它当成根节点处理→→树形dp!!!

注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。

定义状态f[u][0/1]表示u这个节点不放/放士兵

根据题意,如果当前节点不放置士兵,那么它的子节点必须全部放置士兵,因为要满足士兵可以看到所有的边,所以

                 f[u][0]+=f[son][1];

其中son是u的子节点

如果当前节点放置士兵,它的子节点选不选已经不重要了(因为树形dp自下而上,上面的节点不需要考虑),所以

                 f[u][1]+=min(f[son][0],f[son][1]);

ACcode:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1500+10;
  4. vector<int>v[N];
  5. int n,x,k,id,fa[N],f[N][2],ans=1<<30;
  6. void dfs(int u){
  7. f[u][1]=1;
  8. for(int i=0;i<v[u].size();i++){
  9. int son=v[u][i];
  10. dfs(son);
  11. f[u][1]+=min(f[son][0],f[son][1]);
  12. f[u][0]+=f[son][1];
  13. }
  14. }
  15. void solve() {
  16. cin>>n;
  17. for(int i=1;i<=n;i++){//建图
  18. cin>>id>>k;
  19. while(k--){
  20. cin>>x;
  21. v[id].push_back(x);
  22. fa[x]=true;
  23. }
  24. }
  25. for(int i=0;i<n;i++){
  26. if(fa[i]==false){
  27. memset(f,0,sizeof f);
  28. dfs(i);
  29. ans=min(ans,min(f[i][1],f[i][0]));
  30. }
  31. }
  32. cout<<ans<<"\n";
  33. }
  34. int main() {
  35. ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
  36. solve();
  37. return 0;
  38. }

over~

另外思考:无根无向树的根节点怎么求

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/996492
推荐阅读
相关标签
  

闽ICP备14008679号