都不知道怎么分类了。
大概要求一个树中以某个结点为根的子树结点个数,还有儿子结点中以儿子结点为根的子树结点个数的最大值,用递归得到n[i],以i为根节点的子树结点个数
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
#define scan(a) scanf("%d",&(a))
#define M(a) memset((a),0,sizeof((a)))
vector<int> g[22222];
int n[22222];
int n_max[22222];
int T;
int num;
void input()
{
M(n);
M(n_max);
for(int i=0;i<22222;i++)
g[i].clear();
scan(num);
int tmp1,tmp2;
for(int i=0;i<num-1;i++)
{
scan(tmp1);
scan(tmp2);
g[tmp1].push_back(tmp2);
g[tmp2].push_back(tmp1);
}
}
int dfs(int i,int fa)
{
if(g[i].size()==1&&fa!=-1)
{
return n[i]=1;
}
int ans=1;
int tmpmax=0;
for(int j=0;j<g[i].size();j++)
{
if(g[i][j]!=fa)
{
int nn=dfs(g[i][j],i);
tmpmax=max(tmpmax,nn);
ans+=nn;
}
}
n_max[i]=tmpmax;
return n[i]=ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("G:/1.txt","r",stdin);
freopen("G:/2.txt","w",stdout);
#endif
scan(T);
while(T--)
{
input();
dfs(1,-1);
int minn=(1<<30);
int mindex;
for(int i=1;i<=num;i++)
{
int num_minus_ni=num-n[i];
int maxin_i=max(num_minus_ni,n_max[i]);
if(minn>maxin_i)
{
minn=maxin_i;
mindex=i;
}
}
cout<<mindex<<" "<<minn<<'\n';
}
}