版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/83011035
Description
LazyChild开了一家“善良OJ”。但大多数人都不知道,这其实是家黑OJ。亲爱的同学,请不要惊讶,古时候有黑店,现代为什么不能有黑OJ呢?每AC一道题,网站便会自动在电脑上安装一种木马。LazyChild通过窃取信息获取收益(如网游帐号、OI资料、YuanY和TT的照片等等)。
作为一名资深黑客,老Z某日突然发现,“善良OJ”上的木马,自己电脑上都没有。这可十分让他过意不去。老Z决定通过多A题,来丰富自己电脑的病毒库。
经过调查,老Z发现,很多木马是不能共存的。比如“和谐”木马与“团结”木马,两者只能任选其一。然而,老Z是个完美主义者,他想要自己的病毒库尽可能充实。
老Z不懈的追求最终感动了上天。天上的神仙(半仙?)“牛人雨”给这个问题稍稍降低了一点难度。神仙规定,对于n种木马,有且仅有(n-1)对不能共存,并且对于每种木马,都存在至少一个木马与之不能共存。
老Z不在乎自己AC多少题。请告诉他,他最多能从“善良OJ”上获取木马的个数。
Input
第一行,一个正整数n,表示木马个数。
剩余(n-1)行,每行一对木马,表示他们不能共存。(保证相同的木马可以共存,任意不同两行的描述不等价)
木马编号从0至(n-1)
Output
一行,老Z最多获得木马的个数。你可以认为开始时没有任何木马。
Sample Input
3
0 1
1 2
Sample Output
2
HINT
【数据规模】
扫描二维码关注公众号,回复:
3635986 查看本文章
对于100%的数据,1<=n<=200
如果这个点选了,它的儿子就不能选.
否则随便.
#include <iostream>
#include <vector>
#define SIZE 210
using namespace std;
vector<int> graph[SIZE];
int dp[SIZE][2];
void dfs(int u, int pre) // DP过程
{
int i, v;
dp[u][1] = 1; // 边界条件
for (i = 0; i < graph[u].size(); ++i)
{
v = graph[u][i];
if (v != pre)
{
dfs(v, u);
dp[u][0] += max(dp[v][0], dp[v][1]); // 如果这个点没选,它的儿子选不选随便
dp[u][1] += dp[v][0]; // 如果这个点选了,它的儿子就不能选.
}
}
return;
}
int main(int argc, char** argv)
{
int n, u, v;
scanf("%d", &n);
while (--n)
{
scanf("%d%d", &u, &v);
graph[u].push_back(v); // 建图
graph[v].push_back(u);
}
dfs(0, -1);
printf("%d", max(dp[0][0], dp[0][1]));
return 0;
}