ZJK的黑OJ

zjk开了一家“善良OJ”。这其实是家黑OJ。每AC一道题,网站便会自动在电脑上安装一种木马。zjk通过窃取信息获取收益(如网游帐号、OI资料、和KK的照片等等)。

作为一名资深黑客,老Z某日突然发现,“善良OJ”上的木马,自己电脑上都没有。这可十分让他过意不去。老Z决定通过多A题,来丰富自己电脑的病毒库。

经过调查,老Z发现,很多木马是不能共存的。比如“和谐”木马与“团结”木马,两者只能任选其一。然而,老Z是个完美主义者,他想要自己的病毒库尽可能充实。

老Z不懈的追求最终感动了上天。天上的神仙lemon给这个问题稍稍降低了一点难度。神仙规定,对于n种木马,有且仅有(n-1)对不能共存,并且对于每种木马,都存在至少一个木马与之不能共存。

老Z不在乎自己AC多少题。请告诉他,他最多能从“善良OJ”上获取木马的个数。

【输入】

第一行,一个正整数n,表示木马个数。

剩余(n-1)行,每行一对木马,表示他们不能共存。(保证相同的木马可以共存,任意不同两行的描述不等价)

木马编号从0至(n-1)

【输入】

一行,老Z最多获得木马的个数。你可以认为开始时没有任何木马。

【输入样例】

3

0 1

1 2

【输出样例】

2

【数据规模】

对于100%的数据,1<=n<=200

/*
不建树.
用链表搞.
双向建边.
只需要判断father和son是否一样.
然后裸的树上最大独立集.
用树形DP搞.
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1001
using namespace std;
int tot,fa[MAXN][3],w[MAXN],head[MAXN],n;
struct data
{
int v,next,x;
}e[MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int u,int v)
{
e[++tot].v=v;
e[tot].next=head[u];
head[u]=tot;
}
void dfs(int father,int u)
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==father) continue;
dfs(u,v);
fa[u][0]+=max(fa[v][0],fa[v][1]);
fa[u][1]+=fa[v][0];
}
}
int main()
{ int x,y;
n=read();
for(int i=1;i<=n;i++) fa[i][1]=1;
for(int i=1;i<n;i++)
{
x=read();y=read();
x++;y++;
add(x,y);add(y,x);
}
dfs(0,1);
printf("%d\n",max(fa[1][0],fa[1][1]));
return 0;
}
/*
先建树.
不然没法确定点的关系.
然后裸的树上最大独立集.
用树形DP搞.
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1001
using namespace std;
int tot,fa[MAXN][3],w[MAXN],head[MAXN],father[MAXN],son[MAXN][MAXN],n;
struct data
{
int v,next,x;
}e[MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int u,int v)
{
e[++tot].v=v;
e[tot].next=head[u];
head[u]=tot;
}
void build(int x)
{
for(int i=head[x];i;i=e[i].next)
{
int t=e[i].v;
if(!father[t])
{
father[t]=x;
son[x][++son[x][0]]=t;
build(t);
}
}
}
void dfs(int u)
{
if(fa[u][1])return;
fa[u][1]=1;
for(int i=1;i<=son[u][0];i++)
{
int v=son[u][i];
dfs(v);
fa[u][0]+=max(fa[v][0],fa[v][1]);
fa[u][1]+=fa[v][0];
}
}
int main()
{ int x,y;
n=read();
for(int i=1;i<n;i++)
{
x=read();y=read();
x++;y++;
add(x,y);
add(y,x);
}
father[1]=1;
build(1);
dfs(1);
printf("%d\n",max(fa[1][0],fa[1][1]));
return 0;
}

ZJK的黑OJ(树的最大独立集)(树形DP)的更多相关文章

  1. 2014 Super Training #9 E Destroy --树的直径+树形DP

    原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...

  2. [Swust OJ 402]--皇宫看守(树形dp)

    题目链接:http://acm.swust.edu.cn/problem/402/ Time limit(ms): 5000 Memory limit(kb): 65535   Description ...

  3. (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。

    Problem Description   Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...

  4. bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]

    4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...

  5. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  6. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  7. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  8. POJ 1655 BalanceAct 3107 Godfather (树的重心)(树形DP)

    参考网址:http://blog.csdn.net/acdreamers/article/details/16905653   树的重心的定义: 树的重心也叫树的质心.找到一个点,其所有的子树中最大的 ...

  9. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

随机推荐

  1. PHP使用SwiftMailer发送邮件

    用到了swiftmailer 的lib库 官方网址:http://swiftmailer.org/ require_once 'lib/swift_required.php';//给我发送邮件func ...

  2. HW3.6

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  3. Android:从程序员到架构师之路Ⅰ

    一般而言,人们大多先学开发(代码)的技术,随后才学(架构)设计的方法.然而,在实际做事时,却是先设计,随后才写出代码来.敏捷过程则让设计与写码迭代循环下去,一直到完成为止.在本课程里,就遵循敏捷的迭代 ...

  4. (二 )VMware workstation 部署虚拟集群实践——并行批量操作环境部署

    在上一篇博客中,已经介绍了安装虚拟集群的过程和需要注意的细节问题. 这篇主要是介绍如何批量登陆远程主机和配置,这个过程中是在没有部署并行处理工具或者集群管理工具的前进行的. ------------首 ...

  5. 利用Splatting提交参数(Hash,哈希)

    $infos = @{} $infos.Path = 'c:\Windows' $infos.Recurse = $true $infos.Filter = '*.log' $infos.ErrorA ...

  6. oracle学习----行级锁的理解

    通过实验来理解行级锁的发生 1.创建需要的表 SQL> conn / as sysdba已连接.SQL> create table dept as select * from scott. ...

  7. Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例

    1. 用Reader模拟BufferedReader的readLine()功能:   readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: ...

  8. iOS9.0之后不支持http请求解决方案

    打开info.plist文件,添加关键字 NSAppTransportSecurity 类型 Dictionary 在 NSAppTransportSecurity 下添加关键字 NSAllowsAr ...

  9. ruby gem源更换国内源gems.ruby-china.org数据源

    gem sources -l gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ 更新缓存 ge ...

  10. 技术QQ群

    欢迎加入moss技术交流群. 欢迎加入微信技术交流群.