HDU 4705 Y (树形DP)
来源:互联网 发布:js 日期转时间戳 编辑:程序博客网 时间:2024/05/18 03:03
思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数。于是我们可以确定中间点B,在当前以B为根求得的son中任选一个,在剩下的节点n-tmp-1(tmp为已经求得的B的儿子的个数)中任选一个,产生tmp*(n-tmp-1)中组合。
//#pragma comment(linker, "/STACK:102400000,102400000")#pragma comment(linker, "/STACK:16777216")#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <cmath>#include <queue>using namespace std;typedef long long LL;const int INF =1000000000;const int M = 10000010;const int MAXN = 100100;struct Edge{ int v,next;} edge[MAXN*4];int NE;long long n;int head[MAXN];void Insert(int u,int v){ edge[NE].v=v; edge[NE].next=head[u]; head[u]=NE++;}bool mark[MAXN];LL sum,ans;int dfs(int u){ mark[u]=true; int son,tmp=0; for(int i=head[u]; ~i; i=edge[i].next) { int v=edge[i].v; if(mark[v]) continue; son=dfs(v);//当前分支儿子的个数 tmp+=son;//已经求出的儿子的个数 ans+=(LL)(n-1-tmp)*son; } return tmp+1;}int main(){ int u,v; while(~scanf("%I64d",&n)) { NE=0; memset(head,-1,sizeof(head)); for(int i=1; i<n; i++) { scanf("%d%d",&u,&v); Insert(u,v); Insert(v,u); } memset(mark,false,sizeof(mark)); ans=0; dfs(1); sum=n*(n-1)*(n-2)/6; printf("%I64d\n",sum-ans); } return 0;}
0 0
- HDU 4705 Y(简单树形DP)
- HDU 4705 Y (树形DP)
- hdu 4705 Y (树形dp)
- HDU 4705 Y (树形DP + 计数)
- Hdu 4705 Y -- 树形
- HDOJ 4705 Y 树形DP
- HDOJ题目4705 Y(简单树形DP+数学)
- hdu - 4705 - Y(树型dp)
- hdu 4705 Y(树dp)
- HDU-4705 Y(树型dp)
- HDU4705 - Y (树形DP)
- hdu4705 Y--树形dp
- hdu 4705 (树形DP)
- HDU 4705 树形DP
- hdu 4705 树形dp
- hdu 4705(树形DP)
- HDU-4705 树形DP
- HDU 4705 树形DP
- 移植expect出现的错误提示,以及解决办法
- HDOJ 1272 小希迷宫 (并查集)
- C++基础---string类的capacity/max_size/size/length/empty/reserve/resize
- hdu 5411 CRB and Puzzle 矩阵快速幂
- 图数据库之neo4j-jdbc的使用
- HDU 4705 Y (树形DP)
- HDU 5334(Virtual Participation-(A+C+1)(B+C+1)=K+(1+C)^2-C)
- ACdream 1073
- 115个Java面试题和答案——终极列表(上)
- 黑马程序员——String类和基本数据类型包装类
- 微信记录恢复软件MMRecovery下载与使用方法
- 115个Java面试题和答案——终极列表(下)
- 黑马程序员-[C语言]第三篇:指针总结
- 在VirtualBox中安装Ubuntu 的增强工具包