A.树之呼吸-壹之型-结点深度及父结点 | |||||
|
|||||
Description | |||||
给一棵 n 个结点的树,结点编号从 1 到 n,并指定 m 号结点为根; 请你求出每个结点的父结点,以及它的深度; 规定:根节点的深度为 1,根节点的父结点为 0。 |
|||||
Input | |||||
输入第一行为一个正整数 T,表示测试数据组数; 对于每组测试数据,输入第一行为两个正整数 n、m,表示树的结点数及根结点的编号; 接下来 n - 1 行给出树的结构,每行两个正整数 x、y,表示结点 x 与结点 y 有边相连; 1 <= T <= 15,1 <= n <= 1e5,1 <= m <= n。 |
|||||
Output | |||||
每组测试数据的第一行输出“Case #i:”(不含引号),表示是第 i 组测试数据; 接下来一行依次输出从结点 1 到结点 n 的父结点编号,用空格分隔; 接下来一行依次输出从结点 1 到结点 n 的深度,用空格分隔; 行末请不要输出多余空格。 |
|||||
Sample Input | |||||
2 5 1 1 2 1 3 1 4 4 5 3 3 1 2 3 1 |
|||||
Sample Output | |||||
Case #1: 0 1 1 1 4 1 2 2 2 3 Case #2: 3 1 0 2 3 1 |
|||||
Author | |||||
陈鑫 |
题意:给一棵 n 个结点的树,结点编号从 1 到 n,并指定 m 号结点为根;
请你求出每个结点的父结点,以及它的深度;
规定:根节点的深度为 1,根节点的父结点为 0。
思路:BFS求解父结点和深度
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<queue> 5 using namespace std; 6 typedef long long ll; 7 const int amn=1e5+5; 8 int n,m,fa[amn],deep[amn]; 9 vector<int> eg[amn]; 10 queue<int> q; 11 void bfs(int rt){ 12 while(q.size())q.pop();q.push(rt); 13 memset(deep,0,sizeof deep); 14 fa[rt]=0; 15 deep[rt]=1; 16 while(q.size()){ 17 int u=q.front();q.pop(); 18 for(int i=0;i<eg[u].size();i++){ 19 int v=eg[u][i]; 20 if(deep[v])continue; 21 fa[v]=u; 22 deep[v]=deep[u]+1; 23 q.push(v); 24 } 25 } 26 } 27 int main(){ 28 int T,x,y;scanf("%d",&T); 29 for(int C=1;C<=T;C++){ 30 for(int i=1;i<=n;i++)eg[i].clear(); ///注意vector在输入前要清空 31 scanf("%d%d",&n,&m); 32 for(int i=1;i<n;i++){ 33 scanf("%d%d",&x,&y); 34 eg[y].push_back(x); 35 eg[x].push_back(y); 36 } 37 bfs(m); 38 printf("Case #%d: ",C); 39 for(int i=1;i<=n;i++)printf("%d%c",fa[i],i<n?' ':' '); 40 for(int i=1;i<=n;i++)printf("%d%c",deep[i],i<n?' ':' '); 41 } 42 } 43 /** 44 题意:给一棵 n 个结点的树,结点编号从 1 到 n,并指定 m 号结点为根; 45 请你求出每个结点的父结点,以及它的深度; 46 规定:根节点的深度为 1,根节点的父结点为 0。 47 思路:BFS求解父结点和深度 48 **/