鏈接: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);
}
}
}