标签:dp
都不知道怎么分类了。
大概要求一个树中以某个结点为根的子树结点个数,还有儿子结点中以儿子结点为根的子树结点个数的最大值,用递归得到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‘; } }
poj1655 Balancing Act 【树形DP(很弱)】,布布扣,bubuko.com
poj1655 Balancing Act 【树形DP(很弱)】
标签:dp
原文地址:http://blog.csdn.net/u011775691/article/details/26008565