热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【牛客每日一题】4.15Treepath题解(树上dfs/树形DP)

题目链接:https:ac.nowcoder.comacmproblem14248来源:牛客网题目描述给定一棵n个点的树,问其中有多少

题目链接:https://ac.nowcoder.com/acm/problem/14248
来源:牛客网

题目描述

给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数&#xff1b;接下来n-1行&#xff0c;每行两个整数x&#xff0c;y表示边&#xff1b;保证输入数据形成一棵树&#xff1b;1<&#61;n<&#61;100000
输出描述:
一行一个整数表示答案。

示例1

输入

3
1 2
1 3

输出

1

题目要求长度为偶数的路径数&#xff0c;那么先用链式前向星建图&#xff0c;然后从深度角度出发, 以 1 为根 dfs 求出全部深度

那么我们画个图观察一下&#xff0c;发现偶数层到偶数层 距离为偶数
奇数到奇数层 距离距离也为偶数
那么我们求出奇数层节点为a, 偶数层节点个数为b
答案为排列组合&#xff0c;C(a,2)&#43;C(b,2)C(a,2)&#43;C(b,2)C(a,2)&#43;C(b,2)
换成代码就是(a−1)∗a/2&#43;(b−1)∗b/2(a - 1) * a / 2 &#43; (b - 1) *b / 2(a1)a/2&#43;(b1)b/2
时间复杂度
O(n)O(n)O(n)
在这里插入图片描述

#include
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l&#43;r)/2
#define over(i,s,t) for(register long long i&#61;s;i<&#61;t;&#43;&#43;i)
#define lver(i,t,s) for(register long long i&#61;t;i>&#61;s;--i)
//#define int __int128
using namespace std;
typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A
const ll N&#61;100007;
const ll INF&#61;1e10&#43;9;
const double EPS&#61;1e-10;//-10次方约等于趋近为0
ll dep[N];
ll n,head[N],tot;
struct node
{ll v,nex;
}G[N<<1];
void add(ll u,ll v)
{G[&#43;&#43;tot].v&#61;v;G[tot].nex&#61;head[u];head[u]&#61;tot;
}void dfs(ll u,ll fa)
{dep[u]&#61;dep[fa]&#43;1;for(ll i&#61;head[u];i;i&#61;G[i].nex){if(G[i].v&#61;&#61;fa)continue;dfs(G[i].v,u);}
}
int main()
{scanf("%lld",&n);over(i,1,n-1){ll x,y;scanf("%lld%lld",&x,&y);add(x,y);add(y,x);}dfs(1,0);ll a&#61;0,b&#61;0;over(i,1,n)if(dep[i]&1)a&#43;&#43;;else b&#43;&#43;;printf("%lld\n",ll(a*(a-1)/2)&#43;ll(b*(b-1)/2));return 0;
}

还有一种树形DP我明天再写&#xff0c;先睡了

附上官方题解&#xff1a;
【每日一题】4月15日题目精讲
在这里插入图片描述


推荐阅读
  • Gradle复合构建详解
    自Gradle 3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。 ... [详细]
  • 本文介绍了如何计算给定数组中所有非质数元素的总和,并提供了多种编程语言的实现示例。 ... [详细]
  • 本题探讨了一个生物链模型,其中每个生物 x 可以捕食 x+n 的生物,而 x+n 又捕食 x+2*n 的生物,形成一个循环的食物链。当 x 捕食 y 时,y 和 x+n 会被归类到同一个集合中,同样地,x 也会被归入 y+2*n 所在的集合。 ... [详细]
  • 本文介绍了一个简单的智能指针类的设计与实现方法,通过模板结构体实现资源管理,确保对象在不再需要时能够自动释放内存。 ... [详细]
  • 探讨在C语言编程中,当头文件中声明了一个const变量,但在实现文件中却将其定义为非const变量时,编译器如何处理这一冲突。 ... [详细]
  • 按照频率降序打印数字 ... [详细]
  • 题目概述:给定一棵带颜色节点的树,目标是找到一种方法,通过删除某些边使得每个连通分量内的节点颜色相同。需要计算出所有可能的合法边集的数量。使用动态规划的方法,特别是树形DP来解决问题。 ... [详细]
  • 本文通过C++代码示例,详细介绍了如何利用邻接矩阵构建无向图,并实现图的深度优先遍历(DFS)。文章包括了完整的代码实现,以及对关键函数的解释。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • 辗转相减法在求解最大等比值问题中的应用
    本文探讨了如何利用辗转相减法解决X星球大奖赛中奖金分配的数学问题,通过分析给定的数据点,计算出可能的最大等比值。 ... [详细]
  • 探讨 != 运算符在C++中的重写候选条件,分析标准文档中的相关规定及其应用。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
  • 本文探讨了C++中如何正确使用+运算符来处理字符串和数字的拼接问题,分析了为何某些操作有效而另一些则会引发编译错误。 ... [详细]
  • 本文探讨如何使用 PHP 进行字符串处理,特别是如何检测一个字符串是否存在于另一个字符串中,并确定其具体位置。通过实例代码展示,帮助读者掌握这一常用功能。 ... [详细]
  • 本文详细介绍了 Java 中 freemarker.ext.dom.NodeModel 类的 removeComments 方法,并提供了多个实际使用的代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
author-avatar
Lcy榆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有