树上独立集数量 树型DP
题目描述:
对于一棵树,独立集是指两两互不相邻的节点构成的集合。例如,图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的更多相关文章
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- 【XSY1905】【XSY2761】新访问计划 二分 树型DP
题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...
- 【POJ 3140】 Contestants Division(树型dp)
id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS Memory Limit: 65536K Tot ...
- HDU 5905 Black White Tree(树型DP)
题目链接 Black White Tree 树型DP,设$f[i][j]$为以$i$为根的子树中大小为$j$的连通块中可以包含的最小黑点数目. $g[i][j]$为以$i$为根的子树中大小为$j$的 ...
- 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 ...
- ACM之路(13)—— 树型dp
最近刷了一套(5题)的树型dp题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=116767#overview,算是入了个门,做下总结. ...
- 【题解】Luogu p3047 [USACO12FEB]附近的牛Nearby Cows 树型dp
题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...
- 【题解】Luogu p2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat 树型dp
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断
好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...
随机推荐
- 浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象
ylbtech-浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象 1.返回顶部 1. Boolean 对象 Boolean 对象表示两个值:"tr ...
- python threading.current_thread().name和.getName()有什么区别
今天学到python多线程这块,想显示当前线程是主线程还是子线程.网上一搜,有个方法叫 threading.current().name 定海偶然 但是发现,同样的threading.current_ ...
- linux 下载jdk 、maven、git
jdk: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-secureback ...
- Linux上几款好用的字幕编辑器
如果你经常看国外的大片,你应该会喜欢带字幕版本而不是有国语配音的版本.我在法国长大,童年的记忆里充满了迪斯尼电影.但是这些电影因为有了法语 的配音而听起来很怪.如果现在有机会能看原始的版本,我想,对于 ...
- mybatis整合spring,使用org.mybatis.spring.mapper.MapperScannerConfigurer扫描出现问题
<!-- 加载配置文件 --> <context:property-placeholder location="classpath:db.properties" ...
- Linux进程:管理和调度
一:进程管理 进程.轻量级进程和线程 通常定义:进程是程序执行时的一个实例. 这个很像类和实例对象的关系.从内核来看:进程的目的就是担当分配系统资源(CPU,内存等)的实体. 当进程创建时,它几乎和父 ...
- 【MM系列】SAP SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解 ...
- 应用安全 - 工具 - 浏览器 - 火狐(FireFox) - 漏洞汇总
CVE-2010-3131 Date Aug 类型 Mozilla Firefox - 'dwmapi.dll' DLL Hijacking 影响范围 Firefox <= CVE-2010 ...
- 【转帖】国产x86处理器KX-6000发布
国产最先进x86处理器KX-6000发布:8核3.0GHz 力压酷睿i5处理器 https://www.cnbeta.com/articles/tech/858981.htm 全网所有的网页都写错了 ...
- oracle 数据库备份与恢复
oracle 数据库备份与恢复 包含四个部分: 1.数据泵备份与恢复 2.rman备份与恢复 3.CSV增量备份恢复 4.截库操作 1.数据泵备份与恢复 expdp/ / impdp 时的 CONTE ...