给出一颗数,求没有一条路径穿过的节点三元集合个数。

这样的三元集合呈现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的更多相关文章

  1. HDU-4705 Y 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 题意:给一颗树,从树上任意选择3个点{A,B,C},要求他们不在一条链上,求总共的数目. 容易想 ...

  2. HDOJ 4705 Y 树形DP

    DP:求出3点构成链的方案数 .然后总方案数减去它 Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  3. hdu4705(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 题意: 有一颗树, 选出3个点. 不在同一条路径上的集合数. 分析:这题主要能逆向思考下,用总的 ...

  4. hdu4705 Y 简单树形DP 2013多校训练第十场 J题

    题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...

  5. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  6. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  7. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  8. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  9. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

随机推荐

  1. learning ddr write leveling

  2. (路-莫)-Python基础一

    一,Python介绍 1,python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打 ...

  3. Java中数据类型相互转化

    1 将String 转换成int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String], ...

  4. hdu3377

    题解: 简单的插头dp 加上一个代价即可 代码: #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  5. day06 小数据池,再谈编码

    今日所学 一.  小数据池 二.  is 和==的区别 三.  编码的问题 一.小数据池的作用 用来缓存数据 可以作用的数据类型: 整数(int), 字符串(str), 布尔值(bool). 什么是块 ...

  6. 使用DLL在进程间共享数据

    0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不 ...

  7. uiautomator2 获取APP Toast内容

    前言:appium必须是1.6以上的版本 环境(安装和安装都可以运行成功,我也不确定要不要这个): 1.抓到toast需要安装uiautomator2,安装npm:npm install -g cnp ...

  8. day 42 mysql 数据类型

    mysql 数据类型   数据类型 truncate t1 (删除表) # 无符号类型 alter table t1 modify id tinyint unsigned (表里有值,不能直接改) d ...

  9. css 实现省略号. text-overflow: ellipsis; 同时设置四个属性才可以.

    这个同时需要. text-overflow  ;  overflow  ;  white-space ; width ;  四个属性才可以. <!DOCTYPE html> <htm ...

  10. 深入了解HyperServer

    本文,我们将尝试深入了解uniGUI HyperServer. 可以将HyperServer所有功能分成三类: HyperServer和稳定性 HyperServer和可扩展性 HyperServer ...