1003-每层叶数

mac2024-03-21  31

题目必须01节点为根节点,测试点才过, 如果将输入的第一个节点的level初始化为1,则不通过。 要看清题目啊!!——固定根为01
题目大意
n个节点, m个父节点 根节点固定为01 给出每个父节点的所有儿子,找出每层节点的叶子数目。
处理
1.数组处理 采用顺序存储结构,数组存储每节点, 每节点记录是否为父节点, 其父节点, 所处层数。 #include<bits/stdc++.h> #define MAXN 110 using namespace std; typedef struct node{ int father, level, flag; }node; int main(){ node nodes[MAXN]; int n, m, ID, k; int result[MAXN] = {0}; int maxlevel = 1; cin >> n >> m; for(int i = 0; i <= n; i++){ nodes[i].father = nodes[i].level = nodes[i].flag = 0; } nodes[1].level = 1; //不能是下面for()中, 第一个输入的节点nodes[ID].level为1 for(int i = 0; i < m; i++){ cin >> ID >> k; //if(!i) nodes[ID].level = 1; if(k) //k代表孩子的数目, 可能为0 nodes[ID].flag = 1; int child; for(int j = 1; j <= k; j++){ cin >> child; nodes[child].father = ID; } } for(int i = 1; i <= n; i++){ if(nodes[i].flag){ for(int j = 1; j <= n; j++){ if(nodes[j].father == i){ nodes[j].level = nodes[i].level + 1; } } } } /*for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(nodes[j].level == i){ result[i]++; maxlevel = (maxlevel < i)?i:maxlevel; } } }*/ //是统计每层叶子节点数不是每层节点数 //一个循环: for(int i = 1; i <= n; i++){ if(!nodes[i].flag && nodes[i].level > 0){ result[nodes[i].level]++; }maxlevel = (maxlevel < nodes[i].level)?nodes[i].level:maxlevel; } for(int i = 1; i < maxlevel; i++){ cout << result[i] << " "; } cout << result[maxlevel]; return 0; } 2.dfs(), 遍历计算每层叶子数目 vector, map的使用! //dfs——深入每子树,(遍历)计算每层叶子数目。 //学习:vector函数使用,map初始, 以及size-index 的处理 #include<bits/stdc++.h> #define MAXN 110 using namespace std; vector<int> tree[MAXN]; //记录每个节点的所有儿子 map<int, int > level; //层数-叶子数目对应 int n, m; void dfs(int node, int lev); int main(){ int ID, k; cin >> n >> m; for(int i = 0; i < m; i++){ cin >> ID >> k; int child; for(int j = 0; j < k; j++){ cin >> child; tree[ID].push_back(child); } } //缺少m==0的思考 if(m == 0){cout << n << endl; return 0;} dfs(1, 1); int i; //level.size()与level[index]的问题 cout << level[1]; for(i = 2; i <= level.size(); i++){ cout << " " << level[i]; } return 0; } void dfs(int node, int lev){ if(tree[node].size() == 0){ level[lev]++; return; } else{ for(int i = 0; i < tree[node].size(); i++){ dfs(tree[node][i], lev+1); } } return; }
最新回复(0)