loj

Description

有一些宫殿,它们呈树形结构,相邻的宫殿之间可以互相望见.在一些宫殿设立士兵,使得所有的宫殿都有士兵或是被士兵望见.求最小士兵数.

Sol

状态:

f[x][0] 表示结点i被父结点覆盖,以i为根的树需要的最小士兵数

f[x][1] 表示结点i被自己覆盖,以i为根的树需要的最小士兵数

f[x][2] 表示结点i被子结点覆盖,以i为根的树需要的最小士兵数

转移:(y是x的子结点)

f[x][0]=Σmin(f[y][1],f[y][2])

f[x][1]=Σmin(f[y][1],f[y][2],f[y][3])

f[x][2]=Σmin(f[y][1],f[y][2])+d,d=min(f[y][1]-min(f[y][1],f[y][2]))

就f[x][2]的转移稍微难想一点点,可以这样理解:

先算f[x][2]=Σmin(f[y][1],f[y][2]),但是这样并不能保证一定在某个y上设立了士兵

如果要保证这一点,那么就可能产生附加的代价,就是f[y][1]-min(f[y][1],f[y][2]),加上最小代价即可

Code

 #include<iostream>
#include<cstdio>
#include<vector>
#define Rg register
#define il inline
#define inf 2100000000
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,rt,f[N][],a[N];
vector<int> c[N];
bool d[N];
il void dp(int x)
{
f[x][]=a[x];
int hhh=c[x].size()-,t=inf;
if(hhh<)return;
f[x][]=;
go(i,,hhh)
{
int y=c[x][i];dp(y);
f[x][]+=min(f[y][],f[y][]);
f[x][]+=min(f[y][],min(f[y][],f[y][]));
t=min(t,f[y][]-min(f[y][],f[y][]));
}
f[x][]=f[x][]+t;
}
int main()
{
n=read();
go(i,,n)
{
int t=read(),m,x;
a[t]=read();m=read();
while(m--){x=read();c[t].push_back(x);d[x]=;}
}
go(i,,n)f[i][]=inf;
go(i,,n)if(!d[i]){rt=i;break;}
dp(rt);
printf("%d\n",min(f[rt][],f[rt][]));
return ;
}

随机推荐

  1. SDUT-2122_数据结构实验之链表七:单链表中重复元素的删除

    数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 按照数据输入的相反顺序(逆 ...

  2. AUTOSSH设置ssh隧道,实现反向代理访问内网主机

    内网主机上配置: autossh -M -CNR :localhost: ubuntu@123.207.121.121 可以实现将访问主机123.207.121.121的1234端口的数据,通过隧道转 ...

  3. Android本地数据存储: Reservoir

    一:前言 今天做项目,准备使用本地存储,把一些数据存在本地磁盘上,比如用户名.密码这样的.其实大家都知道,这种情况最常用的就是SharedPreferences了,我也不例外,脑子里第一个想到的就是用 ...

  4. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  5. 2019-7-29-WPF-元素裁剪-Clip-属性

    title author date CreateTime categories WPF 元素裁剪 Clip 属性 lindexi 2019-7-29 10:0:13 +0800 2019-1-3 15 ...

  6. java异常处理格式

    异常处理的5个关键字 try ,catch, finally throw, throws   我的总结: 捕获异常:先捕获小异常再捕获大异常. 程序是调出来的,不是写出来的:多测试是程序员的必修课. ...

  7. python模块之包

    包:将解决一类问题的模块放在同一目录下就形成了一个包 为了更好的了解包,我们就模拟创建一个包 import os os.makedirs('glance/api') os.makedirs('glan ...

  8. 【js】 vue 2.5.1 源码学习(五) props directives规范化 props 合并策略

    大体思路 (四) 上节回顾: A: 对于生命周期函数将父子组件的函数放到一个数组里面,特定时间点调用,保证父子组件函数都调用到. B: 对于directive,filters,components 等 ...

  9. 新手该如何学习JavaScript ?

    JavaScript入门 - 01 准备工作 在正式的学习JavaScript之前,我们先来学习一些小工具,帮助我们更好的学习和理解后面的内容. js代码位置 首先是如何编写JavaScript代码, ...

  10. H3C 链路聚合分类