dfklsJj

Posted sjsjsj-minus-si

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfklsJj相关的知识,希望对你有一定的参考价值。

3.2通过求维护lca的最长链和次长链来求树的直径

inline void work(){
    dfs(1,0);//0号节点是虚点,编号要从1开始编
    int x=1;
    for(int i=2;i<=n;++i) 
        if(deep[i]>deep[x])
            x=i;
    dfs(x,0);
    int y=1;
    for(int i=2;i<=n;++i)
        if(deep[i]>deep[y])
            y=i;
    printf("%d %d",x,y);//直径的俩端点
    printf("%d",deep[y]);//直径
}

3.2通过求维护lca的最长链和次长链来求树的直径

/*****************************************************************/
int n,ans=INT_MAX;
int siz[N];//记录i节点的子树大小
int son[N];//记录i节点的重儿子

inline void dfs(int u,int fa){
    siz[u]=1;
    for(int i=head[u];i;i=e[i].next){//遍历整棵树
        int v=e[i].v;//取出后继节点v
        if(v==fa)continue;//如果后继节点是来时的父亲节点,跳过搜索
        dfs(v,u);//继续以v为当前节点,u为父亲节点深度优先搜索
        siz[u]+=siz[v];//搜索完毕后,用子节点的子树大小来更新父节点子树大小
        if(siz[v]>siz[son[u]])
            son[u]=v;
    }
    int max_size=max(siz[son[u]],n-siz[u]);
    ans=min(ans,max_size);//求重心具体是谁:如果ans被更新了就记录一下u
}

int main(){
    scanf("%d",&n); 
    for(int i=1;i<=n-1;++i){
        int u,v;
        scanf("%d %d",&u,&v);
        add_edge(v,u),add_edge(u,v);
    }
    dfs(1,0);
    printf("%d",ans);
    return 0;
}

/*************************************************************/
inline void find_first_branch(){
    dfs2(x,0);
}

以上是关于dfklsJj的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数