题目链接:点击查看

题目大意:给出一棵树,求三个点不在一条线上的个数

题目分析:正难取反,正着求不管是暴力还是有点技巧都是实现不了的,我们可以求出来三个点在一条直线上的方案数,然后用总的排列组合的方案减去三个点在一条直线的方案数,就是最终答案了,那么该怎么求三个点在一条直线上的数量呢?我们可以利用树形dp,期间维护子树中节点的数量,每次选择子树的根节点作为直线上三个点的那个中点,然后从子树中选择任意一点,再从剩下的点中(即n-sum[v]-1个点)选择任意一点,这样的组合数记得要注意不要加重复了,解决方法就是开一个temp变量用来记录当前根节点下已经统计过的子树的数量,然后求“剩下的点”这个值的时候就不会把先前已经记录过的子树再计算一遍了,详细的请见代码中的dfs函数的书写法

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=3e5+100;vector<int>node[N];int num[N];LL sum;LL n;void dfs(int u,int fa)
{LL temp=0;//用来保存已经用过的节点for(int i=0;i<node[u].size();i++){int v=node[u][i];if(v==fa)continue;dfs(v,u);num[u]+=num[v];temp+=num[v];sum+=num[v]*(n-temp-1);//在这里计算组合数时,记录的是该子树的数量乘以还没有用过的节点,而不是除了该子树之外的所有点}
}int main()
{
//  freopen("input.txt","r",stdin)while(scanf("%lld",&n)!=EOF){for(int i=1;i<=n;i++){node[i].clear();num[i]=1;}for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}sum=0;dfs(1,-1);LL totle=n*(n-1)*(n-2)/6;//排列组合cout<<totle-sum<<endl;}return 0;
}

HDU - 4705 Y(树形dp)相关推荐

  1. HDU 4705 Y (树形DP)

    题意 给定一棵树,计算数集{A,B,C}的个数,其中A,B,C是树上的节点,且不存在一条路径覆盖A,B,C. 思路 朴素的想法是枚举"Y"的中点,然后枚举三条树枝i,j,k,答案就 ...

  2. HDU 5148 Cities (树形DP)*

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5148 #include<bits/stdc++.h> using namespace st ...

  3. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  4. HDU 4616 Game 树形DP

    Problem Description Nowadays, there are more and more challenge game on TV such as 'Girls, Rush Ahea ...

  5. HDU 5148 Cities 树形DP(背包)

    HDU 5148 题意;n个点的树,第i条边长度为c[i],任意选中k个点为特殊点,这k个点中,任意两点间距离的期望值最小为多少? n<=2000,k<=min(50,n) c[i]< ...

  6. HDU Starship Troopers (树形DP)

    Starship Troopers Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  7. hdu 2196(经典树形dp)

    题意:给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 解题思路:这道题网上说是经典的树形dp,不过确实很巧妙.两次dfs应该是比较好想到的,因为某节点最大的距离要么就是一直走到叶子节点, ...

  8. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  9. HDU - 2196 Computer(树形dp)

    题目链接:点击查看 题目大意:给定n个点以及n-1条边,保证可以组成一棵树,问每个点所能到达的最远距离 题目分析:首先这是一颗无向图所组成的树,经过分析,我们可以得到任何一个点,对于它所能到达的最远距 ...

最新文章

  1. python基础---元组、字典、函数、文件、异常
  2. 学用 ASP.Net 之 字符串 (2): string.Format
  3. python 打包 .app 运行 控制台窗口_Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法...
  4. Ubuntu 将应用程序 固定到快快速启动栏(以Sublime为例)
  5. robocopy file backup script
  6. php爬虫:知乎用户数据爬取和分析
  7. Leetcode--845. 数组中的最长山脉
  8. 打印斐波那契数列前10位数字
  9. 修改firefox的默认缩放比
  10. 消除CDH5.2 Accumulo Under-Replicated Blocks
  11. 收拾了一下书架,感觉还是像破烂货市场一样
  12. 挪威养老基金给我们的启示
  13. python global用法_利用Python自动发送钉钉数据消息
  14. 验证码~正则表达式【整理汇总】
  15. 哪几种情况可以销毁session(一般有3种)
  16. 基于matlab 自适应滤波,基于Matlab的自适应滤波器的设计及仿真
  17. 如何从Excel中的另一个单元格引用格式和值?
  18. 优酷 IPv6 演进和实践指南
  19. 阿里图标icon二次引入+ 图标引入后是黑色解决办法。
  20. 组合体视图的画图步骤_画组合体视图的方法与步骤

热门文章

  1. Nginx的rewrite之if指令(一)
  2. ZkServer服务启动的逻辑-ServerCnxnFactory.createFactory
  3. Zookeeper的一致性是什么情况?
  4. 并发的发展历史-真空管和穿孔打卡
  5. 搭建基础架构-ResultMsg
  6. 消息发送到topic多个MessageQueue
  7. kafka相关名称介绍
  8. webflux系列--reactor功能
  9. Spring Cloud Gateway介绍(一)
  10. 利用python进行数据分析第二版pdf百度云_参考《利用Python进行数据分析(第二版)》高清中文PDF+高清英文PDF+源代码...