列表

详情


NC204314. Dis2

描述

给出一颗个点条边的树,点的编号为,对于每个点,输出与点距离为的点的个数。
两个点的距离定义为两个点最短路径上的边的条数。

输入描述

第一行一个正整数
接下来行每行两个正整数表示点之间有一条边。

输出描述

输入共行,第行输出一个整数表示与点距离为的点的个数。

示例1

输入:

4
1 2
2 3
3 4

输出:

1
1
1
1

说明:

{1,3}的距离为{2},点{2,4}的距离为{2}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 73ms, 内存消耗: 6456K, 提交时间: 2020-07-08 15:38:09

#include<stdio.h>
int main()
{int n,u[200050],v[200050],a[200050],b[200050];
 scanf("%d",&n);
   for(int i=1;i<=n-1;i++)

       scanf("%d%d",&u[i],&v[i]);
for(int i=1;i<=n-1;i++)
{
    b[u[i]]++;
    b[v[i]]++;
}
 for(int i=1;i<n;i++)
 {
     a[u[i]]+=b[v[i]]-1;
        a[v[i]]+=b[u[i]]-1;
 }
 for(int i=1;i<=n;i++)
    printf("%d\n",a[i]);
 return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 129ms, 内存消耗: 6628K, 提交时间: 2020-06-27 07:27:51

#include<iostream>
using namespace std;

const int m=200007;
int u[m],v[m],s[m],c[m],n;

int main(){
    cin>>n;
    for(int i=1;i<n;i++)cin>>u[i]>>v[i];
    for(int i=1;i<n;i++)++c[u[i]],++c[v[i]];
    for(int i=1;i<n;i++)s[u[i]]+=c[v[i]]-1,s[v[i]]+=c[u[i]]-1;
    for(int i=1;i<=n;i++)cout<<s[i]<<'\n';
}

C++14(g++5.4) 解法, 执行用时: 220ms, 内存消耗: 4956K, 提交时间: 2020-05-23 00:02:49

#include<iostream>
#define f(i,n) for(int i=1;i<n;i++)
const int m=2e5;int u[m],v[m],s[m],c[m],n;
int main(){
    std::cin>>n;
    f(i,n)std::cin>>u[i]>>v[i];
    f(i,n)++c[u[i]],++c[v[i]];
    f(i,n)s[u[i]]+=c[v[i]]-1,s[v[i]]+=c[u[i]]-1;
    f(i,n+1)std::cout<<s[i]<<'\n';
}

上一题