当前位置:   article > 正文

洛谷P2016战略游戏

洛谷P2016战略游戏
传送门啦

战略游戏这个题和保安站岗很像,这个题更简单,这个题求的是士兵人数,而保安站岗需要求最优价值。

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

根据题意,如果当前节点不放置士兵,那么它的子节点必须全部放置士兵,因为要满足士兵可以看到所有的边,所以
$ f[u][0]+=f[v][1] $ ,其中$ v $ 是 $ u $ 的子节点

如果当前节点放置士兵,它的子节点选不选已经不重要了(因为树形dp自下而上更新,上面的节点不需要考虑),所以
$ f[u][1]+=min(f[v][0],f[v][1]) $

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn = 1505;
  7. inline int read(){
  8. char ch = getchar();
  9. int f = 1 , x = 0;
  10. while(ch > '9' || ch < '0'){if(ch == '-')f = -1; ch = getchar();}
  11. while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
  12. return x * f;
  13. }
  14. int n,flag,k,x;
  15. int head[maxn],tot;
  16. int f[maxn][5];
  17. struct Edge{
  18. int from,to,next;
  19. }edge[maxn << 1];
  20. void add(int u,int v){
  21. edge[++tot].from = u;
  22. edge[tot].to = v;
  23. edge[tot].next = head[u];
  24. head[u] = tot;
  25. }
  26. void dfs(int u,int fa) {
  27. f[u][1] = 1 , f[u][0] = 0;
  28. for(int i=head[u];i;i=edge[i].next) {
  29. int v = edge[i].to;
  30. if(v != fa) {
  31. dfs(v , u);
  32. f[u][0] += f[v][1];
  33. f[u][1] += min(f[v][1] , f[v][0]);
  34. }
  35. }
  36. }
  37. int main(){
  38. n = read();
  39. for(int i=0;i<=n-1;i++){
  40. flag = read(); k = read();
  41. if(k == 0)continue;
  42. for(int i=1;i<=k;i++){
  43. x = read();
  44. add(flag , x); add(x , flag);
  45. }
  46. }
  47. dfs(0 , -1);
  48. printf("%d\n",min(f[0][1] , f[0][0]));
  49. return 0;
  50. }

转载于:https://www.cnblogs.com/Stephen-F/p/9882821.html

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号