hdu4705 Y 树形DP
给出一颗数,求没有一条路径穿过的节点三元集合个数。
这样的三元集合呈现Y字形,求出反面情况,三点为子节点和两个祖先节点,或一个祖先节点与它子树中非父子关系的节点。可由树形DP求得。
#pragma comment(linker, "/STACK:16777216")
#include<stdio.h>
#include<string.h>
typedef long long ll;
const int maxm=1e5+;
int d[maxm],son[maxm],fa[maxm];
ll dp[maxm],Dp[maxm],sum,Sum;
int head[maxm],point[maxm<<],nxt[maxm<<],size;
int n; inline void add(int a,int b){
point[size]=b;
nxt[size]=head[a];
head[a]=size++;
point[size]=a;
nxt[size]=head[b];
head[b]=size++;
} int dfs1(int r){
for(int i=head[r];~i;i=nxt[i]){
int j=point[i];
if(!d[j]){
d[j]=d[r]+;
fa[j]=r;
son[r]+=dfs1(j);
}
}
return son[r]+;
} ll dfs2(int r){
for(int i=head[r];~i;i=nxt[i]){
int j=point[i];
if(d[j]==d[r]+){
dp[r]+=son[j]+dfs2(j);
}
}
sum+=dp[r];
return dp[r];
} void dfs3(int r){
Dp[r]=-son[r]-+Dp[fa[r]]+dp[fa[r]]-dp[r]-son[r]+n-d[fa[r]];
Sum+=Dp[r];
for(int i=head[r];~i;i=nxt[i]){
int j=point[i];
if(d[j]==d[r]+){
dfs3(j);
}
}
} inline int read(){
int x=;
char c=getchar();
while(c>''||c<'')c=getchar();
while(c>=''&&c<=''){
x=x*+c-'';
c=getchar();
}
return x;
} int main(){
while(scanf("%d",&n)!=EOF){
memset(son,,sizeof(son));
memset(head,-,sizeof(head));
size=;
memset(d,,sizeof(d));
memset(dp,,sizeof(dp));
memset(Dp,,sizeof(Dp));
sum=Sum=;
int i;
for(i=;i<=n-;i++){
int a,b;
scanf("%d%d",&a,&b);
// int a=read();
// int b=read();
add(a,b);
}
d[]=;
fa[]=;
dfs1();
son[]=son[]+;
dfs2();
for(i=head[];~i;i=nxt[i]){
dfs3(point[i]);
}
ll ans=((ll)n*(n-)*(n-)//)-sum-Sum/;
printf("%lld\n",ans);
}
return ;}
hdu4705 Y 树形DP的更多相关文章
- HDU-4705 Y 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 题意:给一颗树,从树上任意选择3个点{A,B,C},要求他们不在一条链上,求总共的数目. 容易想 ...
- HDOJ 4705 Y 树形DP
DP:求出3点构成链的方案数 .然后总方案数减去它 Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- hdu4705(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 题意: 有一颗树, 选出3个点. 不在同一条路径上的集合数. 分析:这题主要能逆向思考下,用总的 ...
- hdu4705 Y 简单树形DP 2013多校训练第十场 J题
题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...
- HDU 4705 Y (2013多校10,1010题,简单树形DP)
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
随机推荐
- linux用户管理 用户和用户组信息
用户管理配置文件 用户信息文件 /etc/passwd 密码文件 /etc/shadow 用户配置文件 /etc/login.defs /etc/default/useradd 新用户信息文件 /e ...
- ROM、PROM、EPROM、EEPROM、FLASH ROM、FLASH、eMMC
ROM(Read Only Memory,只读存储器)芯片:在微机的发展初期,BIOS都存放在ROM芯片中.ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不 ...
- bzoj1935
题解: x升序排序 y离散化+树状数组 代码: #include<bits/stdc++.h> using namespace std; ; inline int read() { ,f= ...
- MySQl 主从配置实战
目前后台数据库使用了一个实例做数据统计分析,随着数据井喷,单个实例无法做数据分析.故开始了读写分离. 1.主配置 [client] port = 3306 socket = /tmp/mysql-33 ...
- 如何查看.java文件的字节码(原码)
出自于:https://www.cnblogs.com/tomasman/p/6751751.html 直接了解foreach底层有些困难,我们需要从更简单的例子着手.下面上一个简单例子: 1 pub ...
- C语言进度条实现。(转)
#include <stdio.h> #include <windows.h> //跟新进度条函数 /* * 每传入一个参数就刷新一次进度条 * 当i*<=percent ...
- tf.nn.conv2d
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) input: 指需要做卷积的输入图像,它 ...
- table添加行
需求是要实现表格的动态增加与删除,并且保留标题行和首行,找了半天jq插件,没找到合适的,所以自己写了个demo <!DOCTYPE html> <html> <head& ...
- array_multisort
项目中用到这个函数了 ,起初对这个函数一直是懵逼状态,文档都看的朦朦胧胧的 网上无意间看到这篇文章 ,写的超级详细,收藏了 . 当然要先放原地址:https://www.cnblogs.com/WuN ...
- python cookies提取——从字符串到字典(一行Python代码)
def extract_cookies(cookie): """从浏览器或者request headers中拿到cookie字符串,提取为字典格式的cookies&quo ...