树形dp之树的重心(模板)

题目: 小G有一棵大树

树可以以任意一个结点作为根
memset可以为结构体赋初值
f[i]表示将i点删掉后最大连通块的大小
tot[i]表示以i为根的子树大小
f[i]=max(n-tot[i],max(tot[k])
k是i的儿子

include<bits/stdc++.h>

using namespace std;
int const N=1e3+7;
int n,cnt;
int head[N];
struct node{
int a,next,len;
}edge[N<<1];
void add(int x,int y,int len){
edge[++cnt].a =y;
edge[cnt].len =len;
edge[cnt].next =head[x];
head[x]=cnt;
}
int f[N],vis[N],tot[N],ans=0x3f3f3f3f,pos;
void dfs(int x){

    tot[x]=1;vis[x]=1;
    int z=0;
    for(int i=head[x];i;i=edge[i].next){
        if(vis[edge[i].a]) continue;
        vis[edge[i].a]=1;
        dfs(edge[i].a);
        tot[x]+=tot[edge[i].a];
        z=max(z,tot[edge[i].a]);
    }
    f[x]=max(n-tot[x],z);

//
if(f[x]<ans){
pos=x;
ans=f[x];
}
if(f[x]==ans) pos=min(pos,x);
}
int main(){
while(cin >> n){
cnt=0;ans=0x3f3f3f3f;pos=0x3f3f3f3f;
memset(head,0,sizeof(head));
memset(edge,0,sizeof(edge));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n-1;++i){
int a,b;
cin >> a >> b;
add(a,b,0);add(b,a,0);
}
dfs(1);
cout << pos << " " << ans << endl;
}
return 0;
}

全部评论

相关推荐

快点约我面试吧
投递百度等公司10个岗位
点赞 评论 收藏
分享
想按时下班的大菠萝在...:隔壁学校的,加油多投, 实在不好找可以下个学期开学找,把算法八股准备好,项目有空再换换
投了多少份简历才上岸
点赞 评论 收藏
分享
07-20 21:57
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务