[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$ 牌杀毒 ...
随机推荐
- css布局:左边固定宽度,右边自适应宽度或右侧固定,左侧自适应三种方法
方法一:浮动布局 这种方法我采用的是左边浮动,右边加上一个margin-left值,让他实现左边固定,右边自适应的布局效果 HTML Markup <div id="left" ...
- (转)Linux下清理Cache方法
频繁的文件访问会导致系统的Cache使用量大增, 系统运行缓慢. 1 首先用free 命令查看内存的使用:$ free -m total used fr ...
- ycsb模板介绍
#对应的mongodb uri参数等mongodb.url=mongodb://127.0.0.1:27010/test_1 #对应的mongo数据库名称mongodb.database=test_1 ...
- cocoapods学习
1.安装 http://stackoverflow.com/questions/16459028/rvm-install-error-running-requirements-osx-port-ins ...
- JSON数组不用字符串转换的写法
var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...
- mvc工作总结
MVC的页面跳转方式(放在一般类): filterContext.Result = new RedirectResult("controller/action"); filterC ...
- linux下使用OpenCV的一些问题
完整正确的代码如下: import cv2 import numpy as np image = cv2.imread('Pictures/a.png') cv2.imshow('original_i ...
- urlrrtrieve()实例_下载微博短视频
1.确定目标 在微博页面找一想要下载的短视频,通过审查元素找到视频的url. 如://f.us.sinaimg.cn/00150tBNlx07l0qjoSJi01040201m7z90k010.mp4 ...
- [已解决]gitee初次使用git clone报错
本文描述的错误按实际出现先后顺序排列,并且附上一些其他可能会出现的问题 错误1: JZKJ@DESKTOP-I7Q9QJ4 MINGW64 ~ $ git clone https://gitee.co ...
- python之编码的进阶
识记点: ascii 不支持中文 gbk 国标 中文2 英文1 unicode 万国码 英文2 中文4 utf-8 英文1 欧洲2 亚洲3 硬盘中存储的是字节 用什么编码就用什么解码 # 一段文字的转 ...