USACO2008 Jan 电话网络
Time Limit: 10 Sec Memory Limit: 162 MB
Description
Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流。不过,为此FJ必须在奶牛们居住的\(N(1\leq N\leq10,000)\)块草地中选一些建上无线电通讯塔,来保证任意两块草地间都存在手机信号。所有的\(N\)块草地按\(1..N\) 顺次编号。 所有草地中只有\(N-1\)对是相邻的,不过对任意两块草地\(A\)和\(B\)(\(1 \leq A \leq N; 1 \leq B \leq N; A \neq B\)),都可以找到一个以\(A\)开头以\(B\)结尾的草地序列,并且序列中相邻的编号所代表的草地相邻。无线电通讯塔只能建在草地上,一座塔的服务范围为它所在的那块草地,以及与那块草地相邻的所有草地。 请你帮FJ计算一下,为了建立能覆盖到所有草地的通信系统,他最少要建多少座无线电通讯塔。
Input
第\(1\)行: \(1\)个整数,\(N\)
第\(2..N\)行: 每行为\(2\)个用空格隔开的整数\(A,B\),为两块相邻草地的编号
Output
第\(1\)行: 输出\(1\)个整数,即FJ最少建立无线电通讯塔的数目
Sample Input
5
1 3
5 2
4 3
3 5
输入说明:
Farmer John的农场中有5块草地:草地1和草地3相邻,草地5和草地2、草地4和草地3,草地3和草地5也是如此。更形象一些,草地间的位置关系大体如下:(或是其他类似的形状)
\(4\) \(2\)
\(|\) \(|\)
\(1\)--\(3\)--\(5\)
Sample Output
2
输出说明:
FJ可以选择在草地\(2\)和草地\(3\),或是草地\(3\)和草地\(5\)上建通讯塔。
Source
Solution
一眼的树形DP。非常像JSOI2018潜入行动对不对,不过那道题是计数题,而且操作方式也有点区别。但是思想还是类似的。
我们仿照那个设一下\(dp[i][2][2]\)分别表示\(i\)这个点,有没有安装,有没有被覆盖。然后我们发现\(dp[i][1][1]\)是个废状态,安装了就一定会被覆盖。
因此我们减少一下:
\(dp[i][0]\):\(i\)这个点没有安装信号塔,也没有其子节点安装的覆盖
\(dp[i][1]\):\(i\)这个点没有安装信号塔,但是被其子节点安装的覆盖
\(dp[i][2]\):\(i\)这个点安装了信号塔
显然\(dp[i][2]\)和\(dp[i][0]\)随便转移:
\]
\]
\(dp[i][1]\)就复杂一点了。\(dp[i][1]\)成立的条件是子节点至少要有一个点安装了信号塔。
所以我们统计一个\(是的子节点sum=\sum \limits_{v\text{是}i\text{的子节点}}^{} \min\{dp[v][2],dp[v][1]\}\)。
然后\(是的子节点dp[i][2]=\min \limits_{v\text{是}i\text{的子节点}}^{} sum-\min\{dp[v][2],dp[v][1]\}+dp[v][2]\)
然后就可以愉快地A题了。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define lowbit(x) ((x)&(-(x)))
#define REP(i,a,n) for(register int i=(a);i<=(n);++i)
#define PER(i,a,n) for(register int i=(a);i>=(n);--i)
#define FEC(i,x) for(register int i=head[x];i;i=g[i].ne)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
namespace io{
const int SIZE=(1<<21)+1;char ibuf[SIZE],*iS,*iT,obuf[SIZE],*oS=obuf,*oT=oS+SIZE-1,c,qu[55];int f,qr;
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
inline void putc(char x){*oS++=x;if(oS==oT)flush();}
template<class I>inline void read(I &x){for(f=1,c=gc();c<'0'||c>'9';c=gc())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=gc())x=x*10+(c&15);x*=f;}
template<class I>inline void write(I x){if(!x)putc('0');if(x<0)putc('-'),x=-x;while(x)qu[++qr]=x%10+'0',x/=10;while(qr)putc(qu[qr--]);}
struct Flusher_{~Flusher_(){flush();}}io_flusher_;
}//orz laofudasuan
using io::read;using io::putc;using io::write;
typedef long long ll;typedef unsigned long long ull;
template<typename A,typename B>inline bool SMAX(A&x,const B&y){return x<y?x=y,1:0;}
template<typename A,typename B>inline bool SMIN(A&x,const B&y){return y<x?x=y,1:0;}
const int N=10000+7,INF=0x3f3f3f3f;
int n,x,y,dp[N][3];
struct Edge{int to,ne;}g[N<<1];int head[N],tot;
inline void Addedge(int x,int y){g[++tot].to=y;g[tot].ne=head[x];head[x]=tot;}
inline void DFS(int x,int fa=0){
int sum=0;dp[x][0]=0;dp[x][2]=1;dp[x][1]=INF;
for(register int i=head[x];i;i=g[i].ne){
int y=g[i].to;if(y==fa)continue;DFS(y,x);
dp[x][0]+=dp[y][1];SMIN(dp[x][0],INF);
dp[x][2]+=min(dp[y][0],min(dp[y][1],dp[y][2]));SMIN(dp[x][2],INF);
sum+=min(dp[y][1],dp[y][2]);
}
for(register int i=head[x];i;i=g[i].ne)if(g[i].to!=fa)SMIN(dp[x][1],sum-min(dp[g[i].to][1],dp[g[i].to][2])+dp[g[i].to][2]);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("BZOJ1596.in","r",stdin);freopen("BZOJ1596.out","w",stdout);
#endif
read(n);for(register int i=1;i<n;++i)read(x),read(y),Addedge(x,y),Addedge(y,x);
DFS(1,0);write(min(dp[1][1],dp[1][2])),putc('\n');//错误笔记:手残把dp[1][2]打成dp[2][1]
}
USACO2008 Jan 电话网络的更多相关文章
- BZOJ1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 513 Solved: 232[Submit][S ...
- 1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 601 Solved: 265[Submit][S ...
- 【bzoj1596】[Usaco2008 Jan]电话网络
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- BZOJ 1596: [Usaco2008 Jan]电话网络
Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无 ...
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- BZOJ1596 [Usaco2008 Jan]电话网络 【树形dp】
题目链接 BZOJ1596 题解 先抽成有根树 设\(f[i][0|1][0|1]\)表示以\(i\)为根,儿子都覆盖了,父亲是否覆盖,父亲是否建塔的最少建塔数 转移一下即可 #include< ...
- 【BZOJ】1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1596 一开始交了个貌似正确的dp,wa了. 我只考虑了儿子覆盖的情况,没有考虑父亲QAQ 那么我们要 ...
- 【BZOJ】1596: [Usaco2008 Jan]电话网络
[算法]树上贪心 [题解] 因为一个点必须被覆盖,那么它如果没有被子树节点覆盖的话,就覆盖它的父节点. 从叶子开始贪心. 注意,如果它自己已经被选了就不需要选父节点了. #include<cst ...
- [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)
传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...
- bzoj 1596: [Usaco2008 Jan]电话网络【贪心】
dfs,如果一个点的儿子.本身.父亲都没有塔,就在父亲上建一个 原理不明-- #include<iostream> #include<cstdio> using namespa ...
随机推荐
- B/S选择文件夹上传
1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...
- luogu P1449 后缀表达式 x
题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...
- 【Java】java.sql.SQLDataException: Cannot determine value type from string
报错如下: There was an unexpected error (type=Internal Server Error, status=500). Error attempting to ge ...
- Oracle数据库一些操作信息
Oracle数据库如何查看当前用户角色权限及默认表空间查看当前用户的一些信息,包括用户拥有的角色权限信息.用户表空间以及用户和默认表空间的关系等--查看用户的角色权限1.查看当前用户拥有的角色权限信息 ...
- MatrixTraceTransform主要逻辑在transform方法中
@Override public void transform(TransformInvocation transformInvocation) throws TransformException, ...
- ANTLR4的IntelliJ IDEA配置
1.配置的先导工作 jdk配置 IntelliJ IDEA安装配置 配置好ANTLR的java运行时环境,参考 2.下载intellij-plugin-v4.zip 下载地址 3.插件安装 4.测试安 ...
- scrapy xpath xpath('---').xpath('string(.)') 提取子元素全部文本
product.xpath("div//div[@class='a-row a-spacing-mini'][1]/div[2]").xpath('string(.)')
- CSS-父元素宽度自适应子元素宽度之和
最近碰见这样一个需求,要让图片横向排列设置 x 方向的滚动条滚动查看,原本当直接创建一个 IFC(inline,float 什么的)就解决了,搞了半天发现搞不定(IFC 也是不能父元素宽度自适应子元素 ...
- 设计模式 - 装饰器模式(Decorator)
简介 场景 通过继承和关联都可以给对象增加行为,区别如下: 继承是静态的(无法在程序运行时动态扩展),且作用于所有子类.硬编码,高耦合. 通过装饰器可以在运行时添加行为和属性到指定对象.关联关系就是在 ...
- Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)
单域名证书的生成可以 参考这里. acme.sh 项目中文文档 Let's Encrypt 在 18 年 1 月份推出了 ACME v2,支持通配符域名证书,对小网站.个人站长的友好度进一步增加. 常 ...