首页 > 其他 > 详细

4.15 每日一题题解

时间:2020-04-15 10:26:54      阅读:54      评论:0      收藏:0      [点我收藏+]

Treepath

涉及知识点:

  • 树上dfs/dp

solution:

  • \(以任意一个节点dfs(默认以1号节点dfs)\)
  • \(因为树上任意两点之间的距离是固定的,所以我们可以dfs得到所有点距离1号节点的长度\)
  • \(存在两个结论(证明看下图):\)
  • \(①长度为偶数的任意两个节点之间的距离一定是偶数\)
  • \(②长度为奇数的任意两个节点之间的距离也一定是偶数\)
  • $最后记录距离1号节点长度为奇数的节点个数cnt1,距离1号节点长度为偶数的节点个数cnt2 $
  • \(答案就是(cnt1*(cnt1-1)/2) + (cnt2*(cnt2-1)/2)\)
    技术分享图片

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
struct node{
  int t,nex;
};
node a[maxn<<1];
int head[maxn],tot,cnt[maxn];
void add(int x,int y){
    a[++tot].t = y,a[tot].nex = head[x],head[x] = tot;
}
void dfs(int x,int fa,int len)
{
    cnt[x] = len;
    for(int i=head[x]; i ; i=a[i].nex){
        if(a[i].t != fa)
            dfs(a[i].t , x , len + 1);
    }
}
int main()
{
    int n,x,y,cnt1 = 0 ,cnt2 = 0;
    cin>>n;
    for(int i=1;i<n;i++)
        cin>>x>>y,add(x,y),add(y,x);
    dfs(1 , 0 , 0);
    for(int i=1;i<=n;i++){
        if(cnt[i]%2)cnt1++;
        else cnt2++;
    }
    cout<<(1ll*cnt1*(cnt1 - 1)/2) + (1ll*cnt2*(cnt2 - 1)/2)<<endl;
    return 0;
}

4.15 每日一题题解

原文:https://www.cnblogs.com/QFNU-ACM/p/12703226.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!