链接:https://ac.nowcoder.com/acm/contest/5633/B
来源:牛客网
题目描述
给出一颗n个点n−1条边的树,点的编号为1,2,...,n−1,n,对于每个点i(1<=i<=n),输出与点i{i}i距离为2的点的个数。
两个点的距离定义为两个点最短路径上的边的条数。
输入描述:
第一行一个正整数n。
接下来n−1行每行两个正整数ui,vi表示点ui,vi之间有一条边。
输出描述:
输入共n行,第i行输出一个整数表示与点i距离为2的点的个数。
示例1
输入
4 1 2 2 3 3 4
输出
1 1 1 1
说明
点1,3的距离为2,点2,4的距离为2。
备注:
1<=ui,vi<=n<=200000
n-1条边所以没有成环,直接算与其相邻的点的相邻点的个数即可
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<int> we[200010];
int vis[200010];
int main(){
int n;
while( scanf("%d", &n) != EOF){
for( int i = 0; i <= n; i++){
we[i].clear();
vis[i] = 0;
}
int l, r;
for( int i = 1; i < n; i++){
scanf("%d %d", &l, &r);
we[l].push_back(r);
we[r].push_back(l);
}
for( int i = 1; i <= n; i++){
ll sum = 0;
for( int j = 0; j < we[i].size(); j++){
sum+=we[we[i][j]].size() - 1;
}
printf("%lld\n", sum);
}
}
}