家族階層は、通常、家系図によって提示されます。あなたの仕事は、子供がいない家族を数えることです。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各ケースは、ツリー内のノードの数である0 <N <100と、非リーフノードの数であるM(<N)を含む行で始まります。次に、M行が続き、それぞれが次の形式になります。
ID K ID[1] ID[2] ... ID[K]
ここで、ID
は特定の非リーフノードを表す2桁の数字でK
あり、はその子の数であり、その後にその子の2桁ID
のシーケンスが続きます。簡単にするために、ルートIDをに修正してみましょう01
。
入力はNが0で終了します。そのケースは処理しないでください。
出力仕様:
各テストケースでは、根本から始まり、すべての年功レベルで子を持たない家族を数えることになっています。数字はスペースで区切られた行に出力されなければならず、各行の終わりに余分なスペースがあってはなりません。
サンプルケースは、2つのノードのみを持つツリーを表しています。ここ01
で、はルートで02
あり、唯一の子です。したがって、ルート01
レベルには0
リーフノードがあります。そして次のレベルでは、1
葉ノードがあります。次に0 1
、1行に出力します。
入力例:
2 1
01 1 02
出力例:
0 1
アイデア
このトピックのアイデアは非常にシンプルです。つまり、DFSまたはBFSを使用して検索し(ここではDFSを使用しました)、それがリーフノードである場合は、戻り、対応するレベル[現在のリーフノードの数] ++を提供します(そうでない場合)。リーフノード、次にそのすべての子ノードを探し、最初に子ノードのレベルを処理し、最大レベルmaxlevel値を更新します、次に、各子ノードでDFS検索を実行します。検索が完了すると、配列レベルの値を順番に出力できます。
この質問には小さな穴があります。つまり、現在の状況など、入力時に乱れる可能性があります。
非リーフノードは明らかに01と03です。01と03を順番に入力すると、それらのほとんどはコードは問題ありません。すべてACにすることができますが、この質問は含まれていません。つまり、入力に不規則性がある可能性があります(ここで注意してください:部分的に正しい状況が発生した場合は、テストデータを上下逆に入力してみてください多くの場合、無秩序(WA)を考慮しない、つまり03を入力してから01を入力することが原因です。そのため、各ノードのレベルを指定すると、データを入力するときに指定できません。良い(ポジティブシーケンスの場合のみ、データの入力時に処理できます。それ以外の場合、入力は最初にサブノードがあり、サブノードの数はサブノードの数に1を加えたものです。これは問題ありませんが、サブノード自体のレイヤー数はいくつですか?知ることはできません)。
したがって、データを入力するときは、ノード間の親子関係のみを処理し、DFS検索を実行するときに、親と子の間のレイヤー数間の関係を処理する必要があります。すべてのデータが保存された後、順序の入力が正の場合でも正の入力の場合でも、階層の処理でエラーは発生しません。)。
コード
#include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
const int maxn = 1010;
struct node{
int deep;
vector<int> child;
node(){
deep = 1;
child.clear();
}
}Node[maxn];
vector<int> node[100];//记录当前结点和孩子结点
int level[maxn] = {0};//用于存放当前层的叶子结点数
void dfs(int id, int &maxlevel){
if(Node[id].child.size()==0){//size为0就说明没孩子,即叶子结点
level[Node[id].deep]++;//当前层的叶子数目+1
return;
}
for(int i=0;i<Node[id].child.size();i++){
Node[Node[id].child[i]].deep = Node[id].deep + 1;//孩子的deep是父亲的deep+1
if(Node[Node[id].child[i]].deep>maxlevel) maxlevel = Node[Node[id].child[i]].deep;//更新最大深度
dfs(Node[id].child[i], maxlevel);//dfs每个孩子
}
}
int main(){
int N, M;
scanf("%d%d", &N, &M);
if(N==0) return 0;
Node[1].deep = 1;//初始化根结点
Node[1].child.clear();
int maxlevel = 1;
while(M--){
int id, k;
scanf("%d%d", &id, &k);
while(k--){
int tmpid;
scanf("%d", &tmpid);
Node[id].child.push_back(tmpid);//放入孩子结点
}
}
dfs(1, maxlevel);
for(int i=1;i<=maxlevel;i++){
if(i==1) printf("%d", level[i]);
else printf(" %d", level[i]);
}
return 0;
}