【每日一题】Treepath

Treepath

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

题意:

给定一棵n个节点的树,求偶数长度路径的数量。

Solution1:

考虑树的深度对距离的影响,可以发现,深度奇偶性相同的点之间的距离总是偶数。

证明:我们先将深度更大的点走到和另一个点深度相同,显然需要偶数步,然后两个点同时移动到最近公共节点,可知所用的步数是相同的,加起来也是偶数。

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;

int n, idx, h[N], dep[N];

struct Node {
  int to, next;
} E[N];

void add(int a, int b) { E[idx].to = b, E[idx].next = h[a], h[a] = idx++; }

void dfs(int u, int fa) {
  dep[u] = dep[fa] + 1;
  for (int i = h[u]; ~i; i = E[i].next) {
    int v = E[i].to;
    if (v == fa) continue;
    dfs(v, u);
  }
}

int main() {
  memset(h, -1, sizeof(h));
  cin >> n;
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    add(x, y);
    add(y, x);
  }
  dfs(1, 0);
  long long odd = 0, even = 0, res;
  for (int i = 1; i <= n; i++) {
    if (dep[i] & 1)
      odd++;
    else
      even++;
  }
  res = odd * (odd - 1) / 2 + even * (even - 1) / 2;
  cout << res << '\n';
  return 0;
}

solution2:

考虑树形dp。 表示从 i 出发,长度为偶数/奇数的路径数。

从子节点到父节点状态转移:


对于 的每一个儿子 ,贡献即为 , dfs回溯时进行合并更新即可。

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
typedef long long ll;

int n, idx, h[N];
ll res, dp[N][2];

struct Node {
  int to, next;
} E[N];

void add(int a, int b) { E[idx].to = b, E[idx].next = h[a], h[a] = idx++; }

void dfs(int u, int fa) {
  dp[u][0] = 1;
  for (int i = h[u]; ~i; i = E[i].next) {
    int v = E[i].to;
    if (v == fa) continue;
    dfs(v, u);
    res += dp[v][0] * dp[u][1];
    res += dp[v][1] * dp[u][0];
    dp[u][0] += dp[v][1];
    dp[u][1] += dp[v][0];
  }
}

int main() {
  memset(h, -1, sizeof(h));
  cin >> n;
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    add(x, y);
    add(y, x);
  }
  dfs(1, 0);
  cout << res << '\n';
  return 0;
}
全部评论

相关推荐

2025年10月3日中午,在写完定时一年后发给自己的信之后,敲下键盘,写下这篇文字。我把标题的“所有人”加了引号,因为如我们所见,确实有的人顺风顺水,每天过的很开心,或是早早进入大厂,或是年纪轻轻就拿到了高薪offer,或是过着可能我努力十年也不一定实现的生活。但也许,不是每个人的痛苦都能被别人看到的,这个月我经常会哭,被骗6000块钱、手上钱不够导致拖欠房租、生活还要借朋友钱、国庆长假也没有钱去旅游,互联网公司不稳定担心试用期不过(毕竟上段实习就是被裁了,一有点风吹草动就害怕),但这样的我,不是所有人都知道的,居然是有些朋友的羡慕对象。回忆我的七年“长跑”别人都是多年幸福的恋爱长跑,我没有恋...
故事和酒66:让每一颗种子找到合适自己的生长方式,最终绽放出独一无二的花朵,这远比所有人都被迫长成同一棵“参天大树”的世界,更加美好和富有生机。这是社会和环境的问题,而不是我们的问题。然而就是在这样的环境中,楼主依然能突破自我,逆势成长,其中的艰辛可想而知。这一路的苦难终究会化作你成长的养料
你小时候最想从事什么职业
点赞 评论 收藏
分享
08-30 15:51
已编辑
蚌埠坦克学院 Java
狸猫换offer:感觉hr写这段字的时候充满怨气
lastday知无不言
点赞 评论 收藏
分享
站队站对牛:兄弟 你这是四年就当大一过了吧 也许你校园卡 赚了有五位数了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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