P2996

传送门

题意:

给你一棵树,每一条边上最多选一个点,问你选的点数.

我的思想:

一开始我是想用黑白点染色的思想来做,就是每一条边都选择一个点.

可以跑两边一遍在意的时候染成黑,第二遍染成白,取一个最大值.

就可以得到\(30\)分的高分.

#include <bits/stdc++.h>
#define N 100010
#define M 1010
#define _ 0 using namespace std;
int n, tot, ans, add_edge, color[N], head[N];
struct node {
int next, to;
}edge[N]; int read() {
int s = 0, f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
return f ? -s : s;
} void add(int from, int to) {
edge[++add_edge].next = head[from];
edge[add_edge].to = to;
head[from] = add_edge;
} void dfs(int x, int fx) {
if (color[fx] == 0) {
color[x] = 1;
tot++;
}
for (int i = head[x]; i; i = edge[i].next) {
int to = edge[i].to;
if (to == fx) continue;
dfs(to, x);
}
} int main() {
n = read();
int point;
for (int i = 1, x, y; i < n; i++) {
x = read(), y = read();
add(x, y), add(y, x);
point = x;
}
dfs(point, 0);
ans = max(ans, tot);
memset(color, 0, sizeof (color));
tot = 0, color[0] = 1;
dfs(point, 0);
cout << max(ans, tot);
}

很明显这样做是错误的.来看这样一组样例.



按照上述方法跑出来就是\(5\),显然答案是\(7\).然后我就是这样被学长\(hack\)了.

然后就问了学长树形\(DP\).

正确思路:

我们设\(dp[i][1/0]\)来表示\(i\)与\(i\)的子树在\(i\),选还是不选,时的最大权值.

然后又因为在\(dp[i][1]\)时他的子节点不能选\(dp[to][1]\).

在\(dp[i][0]\)时都可以选.我们就可以得到这样的转移方程(用\(to\)来表示\(i\)的子节点):

\[dp[x][0] += max(dp[to][1], dp[to][0]);
\]

\[dp[x][1] += dp[to][0];
\]

然后就做完了.

code :

#include <bits/stdc++.h>
#define N 100010
#define M 50010
#define _ 0 using namespace std;
int n, add_edge, head[N];
int dp[M][2];
struct node {
int next, to;
}edge[N]; int read() {
int s = 0, f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
return f ? -s : s;
} void add(int from, int to) {
edge[++add_edge].next = head[from];
edge[add_edge].to = to;
head[from] = add_edge;
} void dfs(int x, int fx) {
dp[x][1] = 1;
for (int i = head[x]; i; i = edge[i].next) {
int to = edge[i].to;
if (to == fx) continue;
dfs(to, x);
dp[x][0] += max(dp[to][1], dp[to][0]);
dp[x][1] += dp[to][0];
}
} int main() {
n = read();
for (int i = 1, x, y; i < n; i++) {
x = read(), y = read();
add(x, y), add(y, x);
}
dfs(1, 0);
cout << max(dp[1][0], dp[1][1]);
}

洛谷 P2996 [USACO10NOV]拜访奶牛Visiting Cows的更多相关文章

  1. 洛谷P2996 [USACO10NOV]拜访奶牛Visiting Cows

    题目 树形dp 设f[i][j]表示走到第i号节点的最大权值 j为0/1表示这个点选或者不选 如果这个点不选 就从他的子树里的选或者不选选最大 如果这个点选 就加上他子树的不选 f[x][0] += ...

  2. [P2996][USACO10NOV]拜访奶牛Visiting Cows (树形DP)

    之前写在洛谷,结果没保存,作废…… 听说考前写题解RP++哦 思路 很容易想到是 树形DP 如果树形DP不知道是什么的话推荐百度一下 我在这里用vector储存边 设状态f[i][0]为i点不访问,f ...

  3. 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题目描述 Farmer John has decided to reward his cows for their har ...

  4. POJ3621或洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows

    一道\(0/1\)分数规划+负环 POJ原题链接 洛谷原题链接 显然是\(0/1\)分数规划问题. 二分答案,设二分值为\(mid\). 然后对二分进行判断,我们建立新图,没有点权,设当前有向边为\( ...

  5. 洛谷 P3088 [USACO13NOV]挤奶牛Crowded Cows 题解

    P3088 [USACO13NOV]挤奶牛Crowded Cows 题目描述 Farmer John's N cows (1 <= N <= 50,000) are grazing alo ...

  6. 洛谷P2868 [USACO07DEC]观光奶牛 Sightseeing Cows

    题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...

  7. 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...

  8. 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows(01分数规划)

    题意 题目链接 Sol 复习一下01分数规划 设\(a_i\)为点权,\(b_i\)为边权,我们要最大化\(\sum \frac{a_i}{b_i}\).可以二分一个答案\(k\),我们需要检查\(\ ...

  9. 洛谷 2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目戳这里 一句话题意 L个点,P条有向边,求图中最大比率环(权值(Fun)与长度(Tim)的比率最大的环). Solution 巨说这是0/1分数规划. 话说 0/1分数规划 是真的难,但貌似有一些 ...

随机推荐

  1. centos7 安装docker(手动和脚本安装)换源 卸载

    centos7 安装docker(手动和脚本安装)换源 卸载 Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker ...

  2. Vue.js 源码分析(十一) 基础篇 过滤器 filters属性详解

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaScrip ...

  3. SQL Inserted 触发器游标结合实例

    SqlServer的Inserted可能是一个集合而不是一条数据,如果有如果需要对插入数据进行处理,有时需要用游标逐条处理 FROM inserted) --插入和更新 declare cur cur ...

  4. Sitecore个性化 - 基础知识

    许多组织选择Sitecore作为其高级个性化功能的网站平台.Sitecore个性化需要什么以及它能为您的品牌提供什么? 今天, 对于希望提供更好的客户体验的组织来说,个性化不仅仅是一个很好的选择 - ...

  5. BCryptPasswordEncoder 判断密码是否相同

    加密 BCryptPasswordEncoder encode = new BCryptPasswordEncoder(); encode.encode(password); 比较 matches(C ...

  6. NFS客户端挂载失败之authenticated unmount request from

    1.故障现象 客户端挂载时夯住,无反应,无报错,如下图: 2.故障前对挂载目录的操作 发现故障前挂载目录被误删除,后通过备份分为恢复 3.故障排查步骤 .检查客户端及服务端防火墙规则 .检查selin ...

  7. [转] linux 查找文本过滤grep正则表达式命令详解用法

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用 ...

  8. 虚拟机Ubuntu18.04 root下 连接 windows 中 winScp

    先查看自己虚拟机中是否有 ssh服务 如果没有的话先安装 apt-get install openssh-server 安装完之后 先手动开启一下服务 /etc/init.d/ssh restart ...

  9. sql 按指定规则排序,例如 按 1,3,2排序 而不是1,2,3

    我们都知道 sql语句中的排序有desc(降序).asc(升序),这两个都是按顺序排列的,最近有一个需求是不按顺序排序了 ,抽出个别的排在前面,并且这种需求是应对的问题中的数据是比较少的,而且没有规律 ...

  10. ListView 根据 文件路径 或 扩展名 显示系统文件图标

    private void 获取文件button1_Click(object sender, EventArgs e)         {            folderBrowserDialog1 ...