深搜练习——生成树中各个节点的子节点个数
0.总结
Get to the points first. The article comes from LawsonAbs!
- 使用深搜得到图的子节点个数信息
1.问题
给出一棵树,生成该树的所有节点的子节点个数。
2.主要思想
- 使用深搜
3.代码
#include<iostream>
using namespace std;
const int maxN = 50005;
typedef struct{
int next,to;
}Edge;
Edge ed[maxN];
int eN = 0;
int head[maxN],vis[maxN];
void add(int a,int b){
ed[eN].next = head[a];
ed[eN].to = b;
head[a]= eN;
eN++;
}
int n,root;//节点数;根节点序号
int son[maxN];//son[i]表示节点i拥有的子节点数
int dfs(int r){
vis[r] = 1;//标记已访问
for(int i= head[r];i!=-1;i=ed[i].next) {
int eTo = ed[i].to;
if(vis[eTo]) continue;
son[r] += (dfs(eTo)+1);
}
return son[r];
}
int main(){
cin >> n >> root;
int x,y;
fill(son,son+maxN,0);
fill(head,head+maxN,-1);
for(int i = 0;i< n-1;i++){
cin >> x >> y;
add(x,y);
add(y,x);
}
dfs(root);
for(int i = 1;i<= n;i++){
cout << son[i]<<" ";
}
}
输入数据
4 4 # 表示有4个节点; 4为根
1 2 # 表示1,2节点间有边
2 3
3 4
输出各个节点的子节点个数信息:
0 1 2 3