题解 | #小G有一个大树#

小G有一个大树

https://ac.nowcoder.com/acm/problem/15033

思路

题目都没看懂就莫名其妙A了,“如果结点数相同输出编号小的”,是指平衡点的编号吗?下面题解是按照这样理解的。
我先讲一下做题思路吧,数据规模很小,1e3,所以可以把每一个节点当作根去找树的最大深度,最大深度最小的第一个节点可以作为平衡点。
找到平衡点之后再来一个push_up对他每一个子节点计算树的节点数,就能求出答案了。

代码

#include<bits/stdc++.h>
#define int ll
#define inf 0x3f3f3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1e5+5;
int n,a[maxn],u,v,tmp,ans=0,id;
int sz[maxn],dep[maxn],tmp_dep=0,mx_dep=1e6+7;
vector<int>G[maxn];

int push_up(int node,int pre){
    sz[node]=1;
    for(int i=0;i<G[node].size();i++){
        if(G[node][i]==pre) continue;
        sz[node]+=push_up(G[node][i],node);
    }
    return sz[node];
} 

void dfs(int node,int pre){
//    cout<<node<<" "<<pre<<endl;
    for(int i=0;i<G[node].size();i++){
        int to=G[node][i];
        if(to==pre) continue;
        dep[to]=dep[node]+1;
        dfs(to,node);
    }
    tmp_dep=max(dep[node],tmp_dep);
}

signed main(){
    scanf("%lld",&n);
    for(int i=1;i<n;i++){
        scanf("%lld%lld",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        memset(dep,0,sizeof(dep));
        tmp_dep=0;
        dfs(i,0);
        if(tmp_dep<mx_dep){
            mx_dep=tmp_dep;
            id=i;
        }
    }
//    cout<<mx_dep<<" "<<id<<endl;
    for(int i=0;i<=G[id].size();i++){
        tmp=push_up(G[id][i],id);
        if(tmp>ans) ans=tmp;
    }
    cout<<id<<" "<<ans;
    return 0;
} 
全部评论

相关推荐

2025-12-15 11:27
门头沟学院 Java
哇哇的菜鸡oc:所有人不要理会,就好了,后面他就知道怎么回事了,只能说有的时候市场都是被宰的人搞坏的
点赞 评论 收藏
分享
01-11 02:09
已编辑
华中师范大学 golang
京京洪洪学java:如果坚定转Java就要先做好暑期结果可能没那么好的准备,大厂也有做go的,也有接受内部切换技术栈的,go怎么就不行了呢?,ACM+华师肯定能接到一些大厂面试的,acm铜的基础可以让你比较轻松地应对中大厂的手撕,就是八股和项目要下硬功夫,至于找不到go项目?github上一直刷啊,跟刷b站主页一样,那么多好的go开源项目,怎么会找不到呢?刷到想学感兴趣的用ai吃透,试着改进或者吸收作为自己的项目,另一个选择就是考研了。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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