codeforces D. Distance in Tree

本文探讨了一种在数论中寻找距离为K的点对数的方法,并通过实例展示了如何利用这种方法解决问题。主要内容包括点对距离的计算、状态确定以及属性分析,旨在提供一种有效解决此类问题的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:在一颗数中找距离为K的点对数 以后确定状态之后,最后看看有什么属性是不用确定的。。
#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
#define LMT 50003
using namespace std;
LL dis[LMT][505];//SB,这里是500!!!!
int next[LMT];
int all,k,n;
LL ans;
struct line
{
    int u,v,next;
}e[2*LMT];
void insert(int u,int v)
{
    e[all].u=u;
    e[all].v=v;
    e[all].next=next[u];
    next[u]=all++;
    e[all].v=u;
    e[all].u=v;
    e[all].next=next[v];
    next[v]=all++;
}
void inidfs(int pre,int u)
{
    dis[u][0]=1;
    int i,v,x;
    for(x=next[u];x!=-1;x=e[x].next)
    if(e[x].v!=pre)
    {
        v=e[x].v;
        inidfs(u,v);
        for(i=0;i<k;i++)
           ans+=dis[v][i]*dis[u][k-i-1];
        for(i=0;i<k;i++)
            dis[u][i+1]+=dis[v][i];
    }
}
int main(void)
{
    int i;ans=0;
    scanf("%d%d",&n,&k);
    memset(next,-1,sizeof(next));
    for(i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        insert(u,v);
    }
    inidfs(-1,1);
    cout<<ans<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值