一開始慣性思維了,只獲取了葉子結點相關內容.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=110;
vector<int> child[maxn];
int layers[10];
void DFS(int root,int layer){
if(child[root].size()==0){
layers[layer]++; //該寫法只能適用於獲取葉子結點相關內容.
return;
}
for(int i=0;i<child[root].size();i++){
DFS(child[root][i],layer+1);
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,m,id,k;
memset(layers,0,sizeof(layers));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %d",&id,&k);
for(int j=0;j<k;j++){
int temp;
scanf("%d",&temp);
child[id].push_back(temp);
}
}
DFS(1,1);
int idx=0,MAX=-1;
for(int i=1;i<10;i++){
if(layers[i]>MAX){
MAX=layers[i];
idx=i;
}
}
printf("%d %d\n",MAX,idx);
return 0;
}
改進.(實際上是將layers[layer]++;位置挪了一下,結果會完全不同.)這時候該語句就能用到樹的每一個結點中.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=110;
vector<int> child[maxn];
int layers[10];
void DFS(int root,int layer){
layers[layer]++;
if(child[root].size()==0){
return;
}
for(int i=0;i<child[root].size();i++){
DFS(child[root][i],layer+1);
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,m,id,k;
memset(layers,0,sizeof(layers));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %d",&id,&k);
for(int j=0;j<k;j++){
int temp;
scanf("%d",&temp);
child[id].push_back(temp);
}
}
DFS(1,1);
int idx=0,MAX=-1;
for(int i=1;i<10;i++){
if(layers[i]>MAX){
MAX=layers[i];
idx=i;
}
}
printf("%d %d\n",MAX,idx);
return 0;
}