zoukankan      html  css  js  c++  java
  • 树的重心与树的直径

    也许更好的阅读体验

    树的重心

    树的重心的定义
    找到这样一个节点,使以其作为根节点时,最大的子树所含节点数最少

    解决方法很简单,随便扯一个节点作为根节点,然后算一个点时考虑完所有儿子后再考虑一下父亲作为子树的答案即可

    两种打法

    int dfs (int x,int fa,int m)
    {
    	son[x]=1,ms[x]=0;//ms max_num_of_son
    	int tans=2000;
    	for (int e=head[x];e;e=nxt[e]){
    		if (to[e]==fa)	continue;
    		int t=dfs(to[e],x,m);
    		if (ms[tans]>ms[t])	tans=t;
    		son[x]+=son[to[e]];
    		ms[x]=max(ms[x],son[to[e]]);
    	}
    	ms[x]=max(ms[x],m-son[x]);
    	if (ms[tans]>ms[x])	tans=x;
    	return tans;
    }
    
    int ans;
    void dfs (int x,int fa,int m)
    {
    	son[x]=1,ms[x]=0;
    	for (int e=head[x];e;e=nxt[e]){
    		if (to[e]==fa)	continue;
    		dfs(to[e],x,m);
    		son[x]+=son[to[e]];
    		ms[x]=max(ms[x],son[to[e]]);
    	}
    	ms[x]=max(ms[x],m-son[x]);
    	if (ms[ans]>ms[x])	ans=x;
    }
    

    树的直径

    求树中最长的一条路径

    树的直径有个性质

    任意一个点,另找一个点到这个点距离最大,那么另外的这个点一定是直径的两个端点中的某个点
    这条性质还是蛮好用的,可以优化一些在树上的递推或者(DP)

    求法1

    考虑一个点作为直径拐弯的点
    记下最大路径和次大路径
    比较所有节点的两者之和即可

    实现的话只需存下最大路径,然后比较当前路径加上最大路径即可
    即看看当前路径是否是次大路径或者更大的路径

    void dfs(int x,int fa) 
    {
        f[x]=0;
        for (int e=head[x];e;e=nxt[e]){
        	if (to[e]==fa)	continue;
        	dfs(to[e],x);
        	ans=max(ans,f[x]+f[to[e]]+w[e]);
        	f[x]=max(f[x],f[to[e]]+w[e]);
        }
    }
    

    求法2

    两边(dfs)或者(bfs)
    利用的是上面说的那条性质
    先随便以一个点作为根节点,然后找到距离它最远的一个节点
    于是我们就确定了直径上一个端点了
    然后我们再从这个端点找到距离它最远的一个节点
    这肯定就是另外一个端点了
    这样的方法有个好处,就是可以方便的找出直径上有哪些点

    实现和说的一样,两遍(dfs)

    int lt,rt;
    void dfs (int x,int &k)
    {
    	if (dis[x]>dis[k])	k=x;
    	for (int e=head[x];e;e=nxt[e]){
    		if (to[e]==fa[x])	continue;
    		fa[to[e]]=x;
    		dis[to[e]]=dis[x]+w[e];
    		dfs(to[e],k);
    	}
    }
    
    dis[1]=0;
    dfs(1,lt);
    fa[lt]=dis[lt]=0;
    dfs(lt,rt);
    
    //标记直径
    is[lt]=true;
    while (rt!=lt)	is[rt]=true,rt=fa[rt];
    //上面的写法是为了形象的说明,其实可以不计lt,因为lt的fa为0
    while (rt)	is[rt]=true,rt=fa[rt];
    

    如有哪里讲得不是很明白或是有错误,欢迎指正
    如您喜欢的话不妨点个赞收藏一下吧

  • 相关阅读:
    mui签到日历
    简单的vue-resourse获取json并应用到模板
    Ubuntu16.04安装wineqq国际版
    spring RestTemplate调用string和URL 请求问题
    java.util.AbstractSequentialList
    java.util.AbstractList
    maven pom 报错 inspects a maven model for resolution problems
    2019/9/6 spring实战第二章,shiro权限加密,授权
    2019/9/4 spring实战,shiro权限简单记录
    mybatis 转换结果问题
  • 原文地址:https://www.cnblogs.com/Morning-Glory/p/11481659.html
Copyright © 2011-2022 走看看