zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    历史上的今天:3月1日
    用Windows Live Writer远程更新wordpress博客
    二月只有28天
    办公也可云概念
    FLASH做的画图板
    FLASH鼠标跟随特效
    silverlight应该以什么面孔见人?
    飞信Fetion 开发资料及下载
    收藏一个数学的C++算法的好博客
    下载网站资源共享
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/12356741.html
Copyright © 2011-2022 走看看