【XSY2411】【CF161D】Distance in Tree

\(Description\)

一棵树是一个不含环的连通图。

树上两点间的距离是两点间最短路径的长度(边的)。

给你一棵\(n\)个点的树和一个正整数\(k\)。找出不同的距离为\(k\)的点对的数量。注意点对\((u,v)\)和\((v,u)\)被认为是相同的。


\(Input\)

第一行包含两个整数\(n\)和\(k\) \((1≤n≤50000,1≤k≤500)\)——点数和要求的两点间距离。

接下来\(n-1\)行代表了边\(“a_{i}\) \(b_{i}”\)(没有引号)\((1≤a_{i},b_{i}≤n,a_{i}≠b_{i})\),\(a_{i}\)和\(b_{i}\)是第\(i\)条边的端点。所有给出的边都是不同的。


\(Output\)

输出单独一个整数——不同的距离正好为\(k\)的树上点对的数量。


\(Sample Input\)

样例输入1
5 2
1 2
2 3
3 4
2 5

样例输入2
5 3
1 2
2 3
3 4
4 5


\(Sample Output\)

样例输出1
4

样例输出2
2


\(HINT\)

第一个样例的距离为\(2\)的点对是\((1,3)\),\((1,5)\),\((3,5)\)和\((2,4)\)。


\(Source\)

 练习题 树1-树形DP

思路

我们考虑计算出对于以\(u\)为根的子树中,距离\(u\)各种距离的节点的个数,这个值可以通过\(u\)的儿子\(v\)来更新

所以我们选择树形\(dp\)

我们设一个数组\(sum[u][t]\),表示以\(u\)为根的子树中,距离\(u\)的距离为\(t\)的节点的个数

那么答案\(ans\)就是\(\sum_{j=0}^{k-1}sum[u][j]\times sum[v][k-j-1]\)

这个简单解释下:枚举与\(u\)距离\(j\)的点,因为要统计距离为\(k\)的点个数,于是我们还需要距离\(k-j\)的点,因为通过\(v\)转移 ,有一个距离\(1\),所以只需要找与\(v\)距离\(k-j-1\)的点的个数,乘起来就可以了

接下来,来讲讲怎么转移方程

也十分简单:\(\sum_{j=1}^{k}sum[u][j]+=sum[v][j-1]\)

很好理解那就不细讲了

于是我们就可以一遍\(dfs\)处理出\(sum\)数组和答案,最后直接输出就好了


代码

#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int n,k,cnt=0;
int to[N<<1],nxt[N<<1],head[N];
int sum[N][510];
int ans=0;
inline void add(int u,int v)
{
    to[++cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}
void dfs(int u,int fa)
{
    sum[u][0]=1;
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(v==fa)continue;
        dfs(v,u);
        for(int j=0;j<k;j++)ans+=sum[u][j]*sum[v][k-j-1];
        for(int j=1;j<=k;j++)sum[u][j]+=sum[v][j-1];
    }
}
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int main()
{
    n=read(),k=read();
    int a,b;
    for(int i=1;i<n;i++)
    {
        a=read(),b=read();
        add(a,b);add(b,a);
    }
    dfs(1,0);
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/ShuraEye/p/11617056.html

时间: 2024-11-08 21:20:22

【XSY2411】【CF161D】Distance in Tree的相关文章

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

【leetcode刷题笔记】Edit Distance

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a characterb) Delete a characterc) Replace

【E2LSH源码分析】E2LSH源码综述及主要数据结构

上一小节,我们对p稳定分布LSH的基本原理进行了介绍(http://blog.csdn.net/jasonding1354/article/details/38237353),在接下来的博文中,我将以E2LSH开源代码为基础,对E2LSH的源码进行注解学习,从而为掌握LSH的基本原理以及未来对相似性搜索的扩展学习打下基础. 1.代码概况 E2LSH的核心代码可以分为3部分: LocalitySensitiveHashing.cpp--主要包含基于LSH的RNN(R-near neighbor)数

【机器学习算法-python实现】矩阵去噪以及归一化

1.背景 项目需要,打算用python实现矩阵的去噪和归一化.用numpy这些数学库没有找到很理想的函数,所以一怒之下自己用标准库写了一个去噪和归一化的算法,效率有点低,不过还能用,大家如果有需要可以拿去. (1)去噪算法:根据概率论的知识,如果一组数据服从正态分布,我们设均值是n,方差是v,那么对于每个离散数值有百分之九十二以上的概率会在(n-3*v,n+3*v)的区间内.所以这里的去噪功能主要是实现如果超出了区间就将这个值标记为区间所能容忍最大值. (2)归一化:找到输入队列最大值max,最

【机器学习算法-python实现】协同过滤(cf)的三种方法实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 协同过滤(collaborative filtering)是推荐系统常用的一种方法.cf的主要思想就是找出物品相似度高的归为一类进行推荐.cf又分为icf和ucf.icf指的是item collaborative filtering,是将商品进行分析推荐.同理ucf的u指的是user,他是找出知趣相似的人,进行推荐.通常来讲icf的准确率可能会高一些,通过这次参加天猫大数据比赛,我觉得只有在数据量非

【华为OJ】【078-计算字符串的距离】

[华为OJ][算法总篇章] [华为OJ][078-计算字符串的距离] [工程下载] 题目描述 Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance. Ex: 字符串A:abcdefg 字符串B: abcdef 通过增加或是删掉字符"g"的方式达到目的.

【Android开发VR实战】三.开发一个寻宝类VR游戏TreasureHunt

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53939303 本文出自[DylanAndroid的博客] [Android开发VR实战]三.开发一个寻宝类VR游戏TreasureHunt VR即Virtual Reality虚拟现实.虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,如何在Androi

【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp;amp; 第一Shader写作

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇.本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式.最后一部分解说了怎样在U

【Open Search产品评测】- 来往,7天轻松定制属于自己的搜索引擎

[Open Search产品评测]--   来往,7天轻松定制属于自己的搜索引擎   [使用背景] 相信很多人都遇到过要给网站或者app做一个搜索功能的需求,很久之前自己折腾过lucene,搞了很久,要自己搞中文分词(比如用中科院的那个)重写tokenizer,自己建索引,做实时更新流程,数据量大了还要考虑怎样给数据分环等等各种问题.从2014年初开始接触opensearch,当时来往要做扎堆搜索(包括搜扎堆,搜帖子,搜某个堆内的帖子,搜堆内成员等)从上手到熟练使用opensearch只用了大概

HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5688    Accepted Submission(s): 2089 Problem Description Jimmy experiences a lot of stress at work these days, especial