C. Friends

题意

对于任一点,求到此点距离不超过6的节点数。

分析

第一次dfs,形成一个以 1 为根的有向树,设 down[i][j] 为以i为根节点,距离 i 点距离不超过 j 的节点数(这些节点都是 i 的子孙节点)

第二次dfs,设 up[i][j] 以 i 为起点,距离 i 点距离不超过 j 的非子孙节点的个数,可根据 down 求得。

code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int INF = 1e9;
const int MAXN = 1e5 + 10; int up[MAXN][10], down[MAXN][10];
vector<int> G[MAXN];
void dfs1(int pre, int u)
{
down[u][0] = 1;
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(v == pre) continue;
dfs1(u, v);
for(int j = 1; j <= 6; j++) down[u][j] += down[v][j - 1];
}
}
void dfs2(int pre, int u)
{
up[u][0] = 1;
if(u != pre) for(int i = 1; i <= 6; i++)
up[u][i] += up[pre][i - 1] + down[pre][i - 1] - down[u][i > 2 ? i - 2 : 0];
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(v != pre) dfs2(u, v);
}
}
int main()
{
int T, c = 1;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 0; i <= n; i++) G[i].clear();
memset(up, 0, sizeof up);
memset(down, 0, sizeof down);
for(int i = 0; i < n - 1; i++)
{
int x, y;
scanf("%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs1(1, 1); dfs2(1, 1);
printf("Case #%d:\n", c++);
for(int i = 1; i <= n; i++)
{
int res = 0;
for(int j = 1; j <= 6; j++) res += up[i][j] + down[i][j];
printf("%d\n", res);
}
}
return 0;
}

随机推荐

  1. android studio 2.3 下载地址

      android studio下载:  Windows+SDK:(1.8GB)| Windows(428 MB) | Linux    idea  win.exe  win.zip 序号 名称 中文 ...

  2. Xcode新建python项目

    1.找到电脑上安装Python的路径.OSX系统默认安装了python,默认的路径为/usr/bin/python.不确定的情况下,也可以打开命令行,用 whereis python 命令查看 2.打 ...

  3. Linux-配置vim开发环境

    vim是一个类似于vi的著名的功能强大.高度可定制的文本编辑器,在vi的基础上改进和增加了很多特性.vim是纯粹的自由软件. 为了满足使用者的要求,将vim界面配置为自己想要的界面类型也变得流行起来. ...

  4. 如何在 ASP.NET Core 中发送邮件

    前言 我们知道目前 .NET Core 还不支持 SMTP 协议,当我么在使用到发送邮件功能的时候,需要借助于一些第三方组件来达到目的,今天给大家介绍两款开源的邮件发送组件,它们分别是 MailKit ...

  5. for循环之初学者N多算法小练习

    for循环之初学者N多算法小练习 显示1到100的数,每行显示5个. for (int i=1;i<=100;i++){     if (i%5==0){         System.out. ...

  6. Hadoop 核心架构

    Hadoop 由许多元素构成.其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件.HDFS(对于本文)的上一层是Ma ...

  7. openlayers3应用一:显示百度地图

    在项目中使用百度地图,最直接的方式是使用百度api,但是使用百度api需要申请key,并且某些功能调用有次数限制. 本文讲述在openlayers3中使用百度地图的方法.调用百度地图,也是经过了几番周 ...

  8. C#基础知识-流程控制的应用(四)

    流程控制我们在编程中运用到的地方非常的多,在上篇中仅仅只是简单的介绍每一种的使用,并没有运用到实例中,很难去理解它真正的作用.下面我们将实际的运用流程控制的代码写一些实例相关的程序,加深对流程控制的理 ...

  9. OC中的单例

    概念 单例模式的意图是类的对象称为系统中唯一的实例,提供一个访问点,供客户类共享资源 什么情况下使用单例 )类只能由一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法 )这个唯一的实例 ...

  10. Oracle的substr函数

    一.Substr函数 substr(目标字符串,开始位置,长度) 注意:这里第三个参数:长度,相当于物理中的标量,没有方向性,所以不能用负值.虽然不报错,但是选择不出任何值出来(欢迎指正) 开始位置可 ...