一开始惯性思维了,只获取了叶子结点相关内容.
#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;
}