Dis2
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给出一颗nn个点n−1n−1条边的树,点的编号为1,2,...,n−1,n1,2,...,n−1,n,对于每个点i(1≤i≤n)i(1≤i≤n),输出与点ii距离为22的点的个数。
两个点的距离定义为两个点最短路径上的边的条数。
输入描述:
第一行一个正整数nn。
接下来n−1n−1行每行两个正整数ui,viui,vi表示点ui,viui,vi之间有一条边。
输出描述:
输入共nn行,第ii行输出一个整数表示与点ii距离为22的点的个数。
示例1
输入
4 1 2 2 3 3 4
输出
1 1 1 1
说明
点1,31,3的距离为22,点2,42,4的距离为22。
备注:
1≤ui,vi≤n≤2000001≤ui,vi≤n≤200000
思路:
距离为2的点的个数=父亲节点的边树-1+子树边树-1
dfs遍历树就行
int n;
const int MAX=2e5+10;
vector<int>g[MAX];
int cnt[MAX];
void dfs(int u,int f){
if(f>0) cnt[u]+=g[f].size()-1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==f) continue;
cnt[u]+=g[v].size()-1;
dfs(v,u);
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0);
for(int i=1;i<=n;i++){
cout<<cnt[i]<<endl;
}
}

该博客介绍了一个关于树形结构的问题,其中需要找出每个节点与其距离为2的其他节点的数量。通过深度优先搜索(DFS)遍历树,并在过程中更新每个节点的计数,可以计算出每个节点的邻接节点和子树中距离为2的节点数量。程序实现了这一算法,并在样例输入中得到了正确输出。

1375

被折叠的 条评论
为什么被折叠?



