P2016题解

题目描述

Bob要建立一个古城堡,城堡中的路形成一棵无根树。他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能瞭望到所有的路。

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

请你编一程序,给定一树,帮 Bob 计算出他需要放置最少的士兵。

题目分析

题目需要求解最少士兵数量,数据规模不大,可以使用树上dp求解。

考虑 \(dp\) 数组表示的意义:由于每个点都可以放或者不放,而这两种情况又会对周围的点产生不同的影响

我们用 \(dp_{i,j} (j \in [0,1])\) 来表示第 \(i\) 个点放置/不放置时所需要的最小花费。

如何满足无后效性的要求?使用 \(dfs\),从深度大的节点向深度小的节点转移即可。

考虑转移方程:

  • 若点 \(i\) 不放置,则与 \(i\) 相连的所有节点都需要放置士兵。转移方程为 \(dp_{i,0} = \sum dp_{to,1}\)。
  • 若点 \(i\) 放置,则与 \(i\) 相连的点可以选择放置会不放置。转移方程为 $dp_{i,1} = \sum \min{dp_{to,0},dp_{to,1}}。

题目代码如下:

//author : yuhang-ren
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define max_n 1511
void read(int &p)
{
p = 0;
int k = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
{
k = -1;
}
c = getchar();
}
while (c >= '0' && c <= '9')
{
p = p * 10 + c - '0';
c = getchar();
}
p *= k;
return;
}
void write_(int x)
{
if(x < 0)
{
putchar('-');
x = -x;
}
if(x>9)
{
write_(x/10);
}
putchar(x%10+'0');
}
void writesp(int x)
{
write_(x);
putchar(' ');
}
void writeln(int x)
{
write_(x);
putchar('\n');
}
struct node
{
int to,nxt;
}edge[2*max_n];
int n,dp[max_n][2],head[max_n],tot;
void add(int u,int v)
{
edge[++tot].to = v;
edge[tot].nxt = head[u];
head[u] = tot;
}
int ans = 0;
void dfs(int u,int fa)
{
dp[u][0] = 0;
dp[u][1] = 1;
for(int i = head[u];i;i = edge[i].nxt)
{
int v = edge[i].to;
if(v == fa)
{
continue;
}
dfs(v,u);
dp[u][0] += dp[v][1];
dp[u][1] += min(dp[v][0],dp[v][1]);
}
}
signed main()
{
#if _clang_
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
read(n);
int u,num,v;
for(int i = 1;i<=n;i++)
{
read(u),read(num);
for(int j = 1;j<=num;j++)
{
read(v);
add(u,v);
add(v,u);
}
}
dfs(0,-1);
writeln(min(dp[0][0],dp[0][1]));
return 0;
}

P2016题解的更多相关文章

  1. 【题解】Luogu p2016 战略游戏 (最小点覆盖)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  2. 题解 P2016 【战略游戏】

    题目 解法跟 dalao @real_ljs 类似,但没有用到递归 [分析] 题目相当于需要求覆盖这颗树需要的最小点数 用 \(Dp_{i,0/1}\) 表示在这棵树中,以 \(i\) 为根节点的子树 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  10. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. ResourceQuota与LimitRange区别

    ResourceQuota与LimitRange区别 ResourceQuota ResourceQuota 用来限制 namespace 中所有的 Pod 占用的总的资源 request 和 lim ...

  2. 03-Sed基础语法及例子

    1 Sed语法及举例 在实际使用sed过程中经常使用字符串的替换.删除.查找等操作.Linux中的编辑器Vi.GVIM.emacs等都可以进行上述操作,但是大量进行操作的时候,效率很低. 地址参数 { ...

  3. 自己的devc++的语法配置

    效果如下

  4. VUE Angular通用动态列表组件-亦可为自动轮播组件-01-根据数据量自动纵向滚动,鼠标划入停止滚动

    本文为纵向轮播,横向轮播/动态列表组件请戳---- 代码是angular的,稍微改改就可以放入Vue项目里,差别不大哟 以下代码可以根据实际情况自行调整 父组件html <app-scroll- ...

  5. SQL分类-DDL_操作数据库_创建&查询

    SQL分类 1.DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等.关键字:create , drop, alter 等 2.DML(Data ...

  6. Kubernetes(k8s)配置文件管理:ConfigMap

    目录 一.系统环境 二.前言 三.ConfigMap概览 四.创建ConfigMap 五.ConfigMap的使用 5.1 以环境变量的方式使用ConfigMap 5.2 以卷的方式使用ConfigM ...

  7. Windows10下yolov8 tensorrt模型加速部署【实战】

    Windows10下yolov8 tensorrt模型加速部署[实战] TensorRT-Alpha基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10.linux ...

  8. 【C++ 泛型编程01:模板】函数模板与类模板

    [模板] 除了OOP外,C++另一种编程思想称为 泛型编程 ,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板 函数模板 函数模板作用 建立一个通用函数,其函数返回值类型和形参类型可以 ...

  9. 重学SpringBoot. step1 全注解的SpringBoot

    参考:<深入浅出SpringBoot 2.x> 全注解的SpringBoot 用户可以通过注解将所需要的对象,存放到IOC容器中,然后SpringBoot可以根据这些需要使用的情况,自动注 ...

  10. Vue25 mixin

    1 简介 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被"混合" ...