【每日一题】Treepath

Treepath

https://ac.nowcoder.com/acm/problem/14248


题目

题目描述:
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。

输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000

输出描述:
一行一个整数表示答案。


解析

听说这道题大佬们还阔以用树形dp,反正我是不会orz。
所以我也就直接就是dfs啦。
  1. 首先要储存树的结构,因为树的形状和根节点都是未知的,所以用树的孩子表示法存起来。(我这里用vector容器做的二维数组做邻接表,邻接矩阵用的麻烦)
  2. 其次我们就要想一下题目的意思了,简单来说就是任意两点之间的距离为偶数的组合数量,所以假设确定有一个根节点,
    到根节点的距离都是偶数的两个点,或者到根节点距离都是奇数的两个点就可以成为一组。(奇数+偶数=奇数,所以不算这种情况)
    所以我们只需要求出到我们确定的根节点的奇数节点数量偶数节点数量就行了。
  3. 然后我们就来算奇数(odd)偶数(even)的大小惹,简单来说就是深搜一遍,看层数就知道是奇偶了。
    (ps:本人一开始还傻了吧唧的忘了根节点也是偶数节点,纠结了好久好久。)
  4. 接下来我们要办的就是数***算了,从数中任选两个数不就是组合数吗,所以奇偶均用求出组合数。


配图

不管看不看图,总感觉有张图会更好理解,hhh


AC代码

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int MAX = 1e5 + 9;
ll odd = 0, even = 0;//记录奇数与偶数
vector<ll> Node[MAX];//用vector容器模拟邻接表

void dfs(ll root, ll fa, ll depth);//深度优先遍历探测所有子节点深度,root为当前根节点,fa为当前根的父节点

int main() {
    js;
    ll n; cin >> n;
    for (ll i = 1; i < n; i++) {
        ll x, y; cin >> x >> y;
        Node[x].push_back(y);
        Node[y].push_back(x);
    }
    //完成树的无向连接,用树的孩子表示法表示
    dfs(1, -1, 0);
    cout << odd * (odd - 1) / 2 + even * (even - 1) / 2 << endl;
    return 0;
}

void dfs(ll root, ll fa, ll depth) {
    if (depth & 1) odd++;
    else even++;
    for (ll i = 0; i < Node[root].size(); i++)
        if (Node[root][i] != fa)
            dfs(Node[root][i], root, depth + 1);
        //因为这棵树是无向的,所有要排除是父节点的可能
}
每日一题 文章被收录于专栏

憨憨的专栏

全部评论

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
今天 12:11
复旦大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务