题目大意:给定一棵树,求移除树中哪些结点后,剩下的结点最多的连通支的结点数目不超过原树总结点的一半。
分析:先用dfs将无根树转为有根树,在一棵有根树中,去掉某个结点后,剩余的分支为儿子结点所在的分支和父亲结点所在的分支,取结点数目最多的一支即可。
View Code
1 #include2 #include 3 #include 4 #define N 10000 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 using namespace std; 7 vector g[N],dep[N]; 8 int p[N],d[N],cnt[N],sum[N],n,dmax; 9 void dfs(int u,int fa)10 {11 int i,v;12 d[u]=(fa==-1?0:d[fa]+1);13 dmax=MAX(dmax,d[u]);14 dep[d[u]].push_back(u);15 for(i=0;i =0;i--)27 {28 for(j=0;j