题目描述:

对于一棵树,独立集是指两两互不相邻的节点构成的集合。例如,图1有5个不同的独立集(1个双点集合、3个单点集合、1个空集),图2有14个不同的独立集,图3有5536个不同的独立集。 

输入:

第一行一个正整数n,表示点的数量。n最大为100000。 
接下来n-1行,有两个整数a、b,表示编号为a、b的两个点之间有一条边,其中a、b大于等于1,小于等于n。 
17 
1 2 
1 3 
2 4 
2 5 
3 6 
3 7 
5 8 
5 9 
7 10 
7 11 
8 12 
8 13 
10 14 
10 15 
12 16 
15 17

输出:

输出一行,包含一个整数,表示独立集的数量。由于这个数很大,你只需要输出这个数除以10081的余数。

分析:

这是一道树形DP。设f[i][0]表示在选i个节点的独集数,f[i][1]表示不选第i个节点的独集数。 
很明显,每一个节点的f都是有它的子节点得到的。 
如果选了第i个节点,那么它的子节点全部不选。所以,f[i][0]就等于它的子节点f[j][1]的乘积。 
反之,不选第i个节点,那么它的子节点可以选也可以不选,f[i][1]等于它的子节点(f[j][0] +f[j][1])的乘积。 
边就用奇怪的方法维护就行了(不要告诉我你不会前向新或边集数组)。

#include<cstdio>
#include<cstring>
#include<algorithm>
const int mo=;
int n,a[][],g[],f[][];
bool bz[];
void qsort1(int l, int r)
{
int i=l;
int j=r;
int x;
int t;
x=a[(l+r)/][];
while (i<=j)
{
while(a[i][]<x) i++; while(a[j][]>x) j--;
if(i<=j)
{
t=a[j][];
a[j][]=a[i][];
a[i][]=t;
t=a[j][];
a[j][]=a[i][];
a[i][]=t;
j--;
i++;
}
}
if (l<j) qsort1(l,j);
if (r>i) qsort1(i,r);
}
void dfs(int x)
{
int z1,z2,z=g[x],l=;
while (a[z][]==x)
{
if (bz[a[z][]]==false)
{
l=;
bz[a[z][]]=true;
dfs(a[z][]);
f[x][]=(f[x][]*f[a[z][]][])%mo;
if (z==g[x])
{
z1=f[a[z][]][];
z2=f[a[z][]][];
}
else
{
z1=(z1*f[a[z][]][]+z1*f[a[z][]][])%mo;
z2=(z2*f[a[z][]][]+z2*f[a[z][]][])%mo;
}
}
z++;
}
if (l==)
{
f[x][]=(z1+z2)%mo;
}
}
int main()
{
int i,j,k;
scanf("%d",&n);
int zl=;
for (i=;i<=n-;i++)
{
int x,y;
scanf("%d%d",&x,&y);
zl++;
a[zl][]=x;
a[zl][]=y;
zl++;
a[zl][]=y;
a[zl][]=x;
}
for (i=;i<=n;i++)
{
f[i][]=;
f[i][]=;
}
qsort1(,zl);
int z=;
for (i=;i<=zl;i++)
{
if (a[z][]!=a[i][])
{
g[a[z][]]=z;
z=i;
}
}
g[a[z][]]=z;
bz[]=true;
dfs();
printf("%d",(f[][]+f[][])%mo);
}

树上独立集数量 树型DP的更多相关文章

  1. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  2. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

  3. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  4. HDU 5905 Black White Tree(树型DP)

    题目链接  Black White Tree 树型DP,设$f[i][j]$为以$i$为根的子树中大小为$j$的连通块中可以包含的最小黑点数目. $g[i][j]$为以$i$为根的子树中大小为$j$的 ...

  5. HDU_1561_The more, The Better_树型dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000 MS (J ...

  6. ACM之路(13)—— 树型dp

    最近刷了一套(5题)的树型dp题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=116767#overview,算是入了个门,做下总结. ...

  7. 【题解】Luogu p3047 [USACO12FEB]附近的牛Nearby Cows 树型dp

    题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...

  8. 【题解】Luogu p2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat 树型dp

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  9. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

随机推荐

  1. Orchestrator MySQL主库故障切换的几种类型

    Orchestrator 对MySQL主库的故障切换分为自动切换和手动切换. 手动切换又分为recover.force-master-failover.force-master-takeover以及g ...

  2. InputNumber计数器

    InputNumber 计数器 仅允许输入标准的数字值,可定义范围 要使用它,只需要在el-input-number元素中使用v-model绑定变量即可,变量的初始值即为默认值. <templa ...

  3. 什么是 go vendor

    go vendor 是golang引入管理包依赖的方式,1.5版本开始引进,1.6正式引进. 基本原理其实就是将依赖的包,特指外部包,复制到当前工程下的vendor目录下,这样go build的时候, ...

  4. 接口自动化-python unittest+requests+HTMLrunner

    从2015年毕业入行软件测试,快满4年了,之前技术分享都在百度贴吧上面,现在正式开始在博客中记录工作技术,努力成长,加油 接口测试的步骤1.组装好该接口需要的参数数据2.使用get或post附带参数数 ...

  5. P2951 【[USACO09OPEN]捉迷藏Hide and Seek】

    典型的最短路,而且只要再加一点点操作,就能得到答案 所以可以直接套模板 具体看程序:: #include<cstdio> #include<queue>//队列专属头文件 #i ...

  6. 二叉搜索树倒序O(nlogn)建树

    由于在某些糟糕情况下,二叉查找树会退化成链,故而朴素建树过程其复杂度可能会退化成\(O(n^2)\). 采用倒序连边建树的方法可以使得二叉查找树建树复杂度稳定在\(O(nlogn)\). 具体思路如下 ...

  7. 【VS开发】【图像处理】自动白平衡(AWB)算法---色温曲线

    原文地址:http://blog.csdn.net/wzwxiaozheng/article/details/38434391 白平衡算法---色温曲线 本文大体讲解了白平衡的算法流程,适用于想了解和 ...

  8. 【安卓开发】一个简单快递查询APP实例的实现摘要

    前言 做毕业设计涉及到安卓开发,决定好好学习安卓开发.在正式做毕业设计之前,有必要先设计和完成一个与毕业设计最终成果相关的demo或者说样例APP.最终毕业设计需要实现的功能包括通过调用PHP端API ...

  9. 迭代器与iterable

    迭代器与iterable 最近在学习ES6,有两个概念一直纠缠不清,就是迭代器与iterable,查阅了一些资料,简单来说迭代器就是包含next方法的对象,而iterable是包含可以在其值上迭代的迭 ...

  10. 克隆完虚拟机后修改网卡,修改静态IP

    命令:vim  /etc/sysconfg/network-scripts/ifcfg-eth0 编辑: vi /etc/udev/rules.d/70-persistent-net.rules 克隆 ...