在一棵树中,去掉一个点,使得剩下的每一颗树的结点数最多的那颗树,结点数最少。
具体解法看注释.
/*
定义dp[i]为去掉i结点,剩下的树里,结点最多的那颗树的结点数。
可分为2类情况。
1、由于i结点的儿子结点都成了一棵树的根节点,所以dp[i] = (i的每个儿子所拥有的结点数,的最大值)。
2、而另一种情况就是剩下的那棵树,所以dp[i] = N-num[i]。
其中num[i]表示以i为根的树的所有结点数,可以dfs求出。
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define MAXN 20005
int N;
vector<int> node[20005];
int num[MAXN];
int dp[MAXN];
bool vis[MAXN]; //由于为无向图,所以用这个来标记此结点是否计算过。
int dfs(int id)
{
int n=node[id].size();
vis[id]=1;
num[id]=1;
for(int i=0;i<n;i++)
{
if(!vis[node[id][i]])
num[id]+=dfs(node[id][i]);
}
return num[id];
}
void cal(int id)
{
int n=node[id].size();
int k;
vis[id]=1;
for(int i=0;i<n;i++)
{
k=node[id][i];
if(vis[k]) //只有可能是它老爸
{
dp[id]=max(dp[id],N-num[id]);
}
else //它儿子
{
dp[id]=max(dp[id],num[k]);
cal(k);
}
}
}
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
node[i].clear();
memset(dp,0,sizeof(dp));
for(int i=1;i<N;i++)
{
scanf("%d%d",&a,&b);
node[a].push_back(b);
node[b].push_back(a);
}
memset(vis,0,sizeof(vis));
dfs(1);
memset(vis,0,sizeof(vis));
cal(1);
int ans=0x7fffffff;
int k;
for(int i=1;i<=N;i++)
{
if(dp[i]<ans)
{
ans=dp[i];
k=i;
}
}
printf("%d %d\n",k,ans);
}
return 0;
}
分享到:
相关推荐
NULL 博文链接:https://128kj.iteye.com/blog/1705139
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ题解 个人写法 线段树每个人都不一样
POJ2014考研试题表达式·表达式树·表达式求值答案
NULL 博文链接:https://200830740306.iteye.com/blog/603493
poj 2763 程序 线段树 LCA 2000MS AC
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj分类poj分类poj分类poj分类
先利用prim算法求出最小生成树,然后通过往MST里加边来判断新生成的最小生成树是否具有最小的权值,POJ上The Unique MST(1679)题是要求判断最小生成树是否唯一,此题其实根本不用这样做,但是为了练习球次小生成树...
北大POJ1159-Palindrome 解题报告+AC代码
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类
POJ1048,加强版的约瑟夫问题 难度中等