列表

详情


NC232359. 生活在树上

描述

ZHR 住在一有根棵树上(1 号节点为根),树上的每条边都有一个距离。由于他特别懒,所以他一天移动的距离不能超过 2,对于每个节点,问他在一天中可以通过这个节点到达多少个不同的节点。

输入描述

第一行一个 n 表示树的节点数量。
接下来 n-1 行,第 i 行两个数 f_iw_i,分别表示这个点的父亲和它到父亲的距离。

输出描述

n 行,第 i 行表示从 i 节点出发能到达多少不同的节点。

示例1

输入:

5
1 2
1 1
2 1
3 3

输出:

3
3
2
2
1

原站题解

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

C++ 解法, 执行用时: 281ms, 内存消耗: 23800K, 提交时间: 2022-03-26 11:26:36

#include <bits/stdc++.h>
using namespace std;

int f[1000010],w[1000010],d1[1000010],d2[1000010];

int main(){
	int n,i;
	scanf("%d",&n);
	for(i=2;i<=n;i++){
		scanf("%d%d",&f[i],&w[i]);
		if(w[i]<=1)
			d1[i]++,d1[f[i]]++;
	}
	for(i=2;i<=n;i++){
		if(w[i]<=1)
			d2[i]+=d1[f[i]],d2[f[i]]+=d1[i];
		else if(w[i]<=2)
			d2[i]++,d2[f[i]]++;
	}
	for(i=1;i<=n;i++)
		printf("%d\n",d2[i]+1);
	return 0;
}

上一题