您的位置:首页 > 其它

POJ 1655 Balancing Act

2016-07-13 09:52 573 查看
只要一次无根树转有根树就可以计算了,一开始每个点都转,发现那就不是动态规划,是枚举了。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=20000+100;
vector<int> G[maxn];
int son[maxn],f[maxn],ans,flag,n;
void dfs(int u,int fa)
{
int maxson=0,d;
son[u]=0;
d=(int)G[u].size();
for(int i=0;i<d;i++)
{
int v=G[u][i];
if(v==fa) continue;
dfs(v,u);
son[u]+=son[v]+1;
maxson=max(maxson,son[v]+1);
}
maxson=max(maxson,n-1-son[u]);
if(maxson<ans||(maxson==ans&&u<flag)){
ans=maxson;
flag=u;
}
}
int main()
{
int t,u,v;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(son,0,sizeof(son));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) G[i].clear();
for(int i=1;i<=n-1;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}

ans=(1<<30);
flag=(1<<30);
dfs(1,-1);
printf("%d %d\n",flag,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: