[BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)
1.树形DP
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 10001 using namespace std; int n, cnt;
int f[N][3], head[N], to[N << 1], next[N << 1];
bool vis[N];
//f[i][0]表示当前子树全选中,且根节点有放
//f[i][1]表示当前子树全选中,但根节点没放
//f[i][2]表示除了根节点以外,子树全选中 inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void add(int x, int y)
{
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
} inline void dfs(int u, int fa)
{
int i, v, flag = 0, falg = 0, tmp = 23333333;
f[u][0] = vis[u] = 1;
for(i = head[u]; ~i; i = next[i])
{
v = to[i];
if(!vis[v])
{
dfs(v, u);
flag = 1;
f[u][0] += min(f[v][0], min(f[v][1], f[v][2]));
if(f[v][0] <= f[v][1])
{
f[u][1] += f[v][0];
falg = 1;
}
else f[u][1] += f[v][1];
f[u][2] += f[v][1];
}
}
if(!falg)
{
for(i = head[u]; i ^ -1; i = next[i])
{
v = to[i];
if(v != fa)
tmp = min(tmp, f[u][1] - f[v][1] + f[v][0]);
}
f[u][1] = tmp;
}
if(!flag) f[u][1] = 23333333;
} int main()
{
int i, x, y;
n = read();
memset(head, -1, sizeof(head));
for(i = 1; i < n; i++)
{
x = read();
y = read();
add(x, y);
add(y, x);
}
dfs(1, 0);
printf("%d\n", min(f[1][0], f[1][1]));
return 0;
}
2.贪心
如果一个点的孩子节点或父亲节点有放,那么这个点就不用放了,如果这个点的儿子节点都没放,并且这个点和父亲节点也没放,那么就放在父节点上,ans++
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 10001 using namespace std; int n, cnt, ans;
int head[N], to[N << 1], next[N << 1];
bool vis[N], f[N]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void add(int x, int y)
{
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
} inline void dfs(int u, int fa)
{
int i, v, flag = 0;
//flag判断是否有儿子被覆盖
vis[u] = 1;
for(i = head[u]; ~i; i = next[i])
{
v = to[i];
if(!vis[v])
{
dfs(v, u);
if(f[v]) flag = 1;
}
}
if(!flag && !f[u] && !f[fa]) f[fa] = 1, ans++;
} int main()
{
int i, x, y;
n = read();
memset(head, -1, sizeof(head));
for(i = 1; i < n; i++)
{
x = read();
y = read();
add(x, y);
add(y, x);
}
dfs(1, 0);
printf("%d\n", ans);
return 0;
}
[BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)的更多相关文章
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP
挺经典的,细节需要特别注意一下 Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s& ...
- BZOJ1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 513 Solved: 232[Submit][S ...
- BZOJ1596 [Usaco2008 Jan]电话网络 【树形dp】
题目链接 BZOJ1596 题解 先抽成有根树 设\(f[i][0|1][0|1]\)表示以\(i\)为根,儿子都覆盖了,父亲是否覆盖,父亲是否建塔的最少建塔数 转移一下即可 #include< ...
- 1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 601 Solved: 265[Submit][S ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- 【bzoj1596】[Usaco2008 Jan]电话网络
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- USACO2008 Jan 电话网络
Time Limit: 10 Sec Memory Limit: 162 MB Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶 ...
- bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心
题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ...
随机推荐
- uvm_reg_defines——寄存器模型(四)
文件: src/marcos/uvm_reg_defines 类: 无 该文件是寄存器模型src/reg/* 文件对于的宏文件,主要定义了寄存器地址位宽,寄存器数据位宽,字节的大小.计算机从最初的8, ...
- 求矩阵的n次方 c语言实现
矩阵的n次方,比较容易理解的想法是递归. 思路是这样的,把n分成两部分,当n是偶数的时候,即为左右两边的乘积,如果n是奇数,即为左右两边的乘积再乘a ) matrixn())^*a else matr ...
- COGS 1786. 韩信点兵
★★★ 输入文件:HanXin.in 输出文件:HanXin.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 韩信是中国军事思想“谋战”派代表人物,被后人奉为“ ...
- jquery 不支持$.browser
if (!$.browser) { $.browser = { mozilla : /firefox/.test(navigator.userAgent.toLowerCase()), webkit ...
- labview密码忘记怎么办,如何破解labview密码,vi密码md5码破解重置
labview密码忘记了或者需要破解labview密码,可以找到vi文件的md5码,把里面的md5码拿到网站http://cmd5.la解密就可以了. 把vi文件的32位md5码放到网站cmd5.la ...
- OpenCascade: 获取边的端点
FirstV = TopExp::FirstVertex(aEdge1); LastV = TopExp::LastVertex(aEdge1);
- 快学UiAutomator创建第一个实例
工具准备 一.准备好java环境(JDK)和安卓环境(SDK.ADT)jdk1.6+ \eclipse\SDK \ADT详情百度,安装java环境 二.打开eclipse 三.创建步骤: 右键新建== ...
- EF关于报错Self referencing loop detected with type的原因以及解决办法
1)具体报错 { "Message": "出现错误.", "ExceptionMessage": "“ObjectContent` ...
- 前台解析json的方法
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- Luogu P3627 抢掠计划
题目传送门 \(Tarjan\)缩点+SPFA最长路 #include<iostream> #include<cstdio> #include<cstring> # ...