日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【两种解法】1004 Counting Leaves (30 分)_27行代码AC

發布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【两种解法】1004 Counting Leaves (30 分)_27行代码AC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

立志用最少的代碼做最高效的表達


PAT甲級最優題解——>傳送門


A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.

Input Specification:
Each input file contains one test case. Each case starts with a line containing 0<N<100, the number of nodes in a tree, and M (<N), the number of non-leaf nodes. Then M lines follow, each in the format:

ID K ID[1] ID[2] … ID[K]
where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID’s of its children. For the sake of simplicity, let us fix the root ID to be 01.

The input ends with N being 0. That case must NOT be processed.

Output Specification:
For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.

The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1 leaf node. Then we should output 0 1 in a line.

Sample Input:
2 1
01 1 02

Sample Output:
0 1


題意與分析

題意:
輸入節點數、非葉子節點數, 接下來m行,每行給出每個非葉子節點的子節點,最后輸出樹的每層葉子節點個數。

分析:
DFS、BFS皆可。
DFS簡單些,
如果使用BFS,需要定義數組保存每個節點所在的層數。


代碼一:DFS解法

#include<bits/stdc++.h> using namespace std;//嵌套vector相當于二維數組 //按層數DFS遍歷,每深入一次,層數+1。統計該層葉子節點即可 vector<vector<int>>tree(100); //下標存儲節點編號,內容存儲兒子節點編號 int Level_leave[100], maxLevel = -1; //每層葉子結點數、最大層數 int N, M;void DFS(int v, int level) { //深度優先遍歷 maxLevel = max(level, maxLevel); //更新最大層數if(tree[v].empty())++Level_leave[level];for(int i : tree[v]) //不是葉節點DFS(i, level+1); //遍歷兒子節點 }int main() {cin >> N >> M; while(M--) {int id, k;cin >> id >> k;while(k--) {int iid; cin >> iid;tree[id].push_back(iid);}}DFS(1, 0); for(int i = 0; i <= maxLevel; i++) printf("%s%d", i==0?"":" ", Level_leave[i]);return 0; }

代碼二:BFS解法

#include<bits/stdc++.h> using namespace std;vector<vector<int>>tree(110); //加上限定范圍相當于二維數組 int n, m, siz; int leave_level[110]; //每層葉子節點個數 int maxLevel = -1, level[110] = {0}; //最大層數,每個節點所在層數 void BFS(int id) {queue<int>q;q.push(id);while(!q.empty()) {int temp = q.front();q.pop();maxLevel = max(maxLevel, level[temp]); //更新最大層數if(tree[temp].empty())++leave_level[level[temp]]; //遞增該節點所處層數下的葉節點數目for(int i : tree[temp]) {level[i] = level[temp] + 1; //兒子節點層數為父親節點層數+1 q.push(i);} } }int main() {scanf("%d%d", &n, &m);while(m--) {int x, k; scanf("%d%d", &x, &k);while(k--) {int v; scanf("%d", &v);tree[x].push_back(v);} }BFS(1);for(int i = 0; i <= maxLevel; i++) printf("%s%d", i==0?"":" ", leave_level[i]);return 0; }

每日好句

你的潛意識,正在操控你的人生,而你卻稱其為命運。

總結

以上是生活随笔為你收集整理的【两种解法】1004 Counting Leaves (30 分)_27行代码AC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。