树学

文章目录

    • 题目描述
    • 题解1:
    • 代码:
    • 题解2:
    • 代码:

传送

时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format:> %lld

题目描述

牛妹有一张连通图,由n个点和n-1条边构成,也就是说这是一棵树,牛妹可以任意选择一个点为根,根的深度deproot为0,对于任意一个非根的点,我们将他到根节点路径上的第一个点称作他的父节点,例如1为根,1-4的;路径为1-3-5-4时,4的父节点是5,并且满足对任意非根节点,depi=depfa i+1,整棵树的价值W=在这里插入图片描述 ,即所有点的深度和

牛妹希望这棵树的W最小,请你告诉她,选择哪个点可以使W最小
输入描述:
第一行,一个数,n
接下来n-1行,每行两个数x,y,代表x-y是树上的一条边
输出描述:
一行,一个数,最小的W
示例1
输入

4
1 2
1 3
1 4

输出

3

备注:
对于30%30%的数据,1<= n<=1000
对于100%100%的数据,1<=n <=106

题解1:

树形dp+换根
用到的几个函数:
dep[i]:节点i的深度
ant[i]:i的子树的个数(含本身)
f[x]:以x为根的每个节点深度的和
在这里插入图片描述
图一为以u为根节点
图二为以v为根节点
从u转到v 之后,图二中黄色区域(u和子树1和子树2)根节点都加1(因为成为别人的子节点),绿色区域(v和根节点2)根节点减1(因为成为别人的根节点)
那转换成公式是什么样的?
f[v]=(f[u]-ant[v])+(n-ant[v]);
怎么理解呢?
第一个括号里,是将图二的绿色区域根节点减一,因为黄色区域一共ant[v]个节点,这个区域内每个节点都减1,所以整个区域f[u]要减ant[v].
第二个括号就是黄色区域每个节点都加一,那整个区域就加这个区域的节点数,这个区域的节点数=整个区域-绿色区域,所以就是n-ant[v]
我们从1开始dfs,求出每个节点的深度,即dep[]
然后再dfs求出每个点子树数量,再dfs换成其他根,利用公式求出f来

代码:

#include<bits/stdc++.h>
#define forr(n) for(int i=1;i<=n;i++)
typedef long long ll;
using namespace std;
const int maxn=1e6+3;
struct node{int u,v,w,next;
}edge[maxn<<1];//链式前项星 
ll head[maxn<<1];//无向边,所以乘2
ll dep[maxn];//节点的深度 
ll ant[maxn];//节点x的子树数量(包含本身) 
ll f[maxn];//以i为根的时候每个点深度的和 
ll cnt=0;
ll minn=1e7;ll n;
void add(ll u,ll v)
{edge[++cnt].v=v;edge[cnt].next=head[u];head[u]=cnt;}
inline void init(ll n)
{forr(n)f[1]+=dep[i];//在dfs1求完每个点深度后,接着求出以1为根的时候每个点深度的和  forr(n)ant[i]=1;//每个节点的子树一开始都是本身 
}	
ll v=0;
void dfs1(ll now,ll fa)
{for(ll i=head[now];i;i=edge[i].next){v=edge[i].v;if(v==fa)continue;dep[v]=dep[now]+1;dfs1(v,now);}
}//以1为根节点开始,计算出每个节点的深度 void dfs2(ll now,ll fa)
{for(ll i=head[now];i;i=edge[i].next){v=edge[i].v;if(v==fa)continue;dfs2(v,now);ant[now]+=ant[v]; }
}//求出x节点的子树数量 
void dfs3(ll now,ll fa)
{for(ll i=head[now];i;i=edge[i].next){v=edge[i].v;if(v==fa)continue;f[v]=f[now]-ant[v]+(n-ant[v]); dfs3(v,now);}
}
//从1开始换成其他根,并求出其他根的f值 
int main()
{cin>>n;for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}	dfs1(1,0);init(n);//初始化 dfs2(1,0);dfs3(1,0);forr(n){minn=min(minn,f[i]);} cout<<minn;return 0;}

仔细看会发现dfs1与dfs2结构相似,完全可以和在一起写
或者用vector写更简洁

题解2:

我看有很多大佬都用重心的性质来做
树的重心有一个这样的性质:在树中所有点到某点的距离和 当中,到树的重心的距离和是最小的,如果有多个重心,那他们距离和一样。
树中所有点到重心的距离和最小,不就是我们要求的那个值吗。
先用dfs树形dp求出重心,再求出重心与每个点的距离进行累加求和

代码:

#include<bits/stdc++.h> 
using namespace std;typedef long long ll;
const int maxn=1e6+3;
int ant[maxn],root[maxn];
int n,cnt;
ll res;
ll point=maxn;vector<int>edge[maxn];
void dfs1(int v,int p)
{ant[v]=0;int maxx=0;for(int i=0;i<edge[v].size();i++){int u=edge[v][i];if(u!=p){dfs1(u,v);ant[v]+=(ant[u]+1);maxx=max(ant[u],maxx);}}maxx=max(n-ant[v]-1,maxx);if(maxx<point){cnt=0;root[++cnt]=v;point=maxx;}else if(maxx==point)root[++cnt]=v;
}
void dfs2(int v,int p,int dep)
{res+=dep;for(int i=0;i<edge[v].size();i++){int u=edge[v][i];if(u!=p)dfs2(u,v,dep+1);}
}
int main()
{scanf("%d",&n);int u,v;for(int i=1;i<n;i++){cin>>u>>v;edge[u].push_back(v);edge[v].push_back(u);}dfs1(1,0);dfs2(root[1],0,0);printf("%lld\n",res);return 0;
}

有关树的重心其他性质,有空专门讲讲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

csp-2019 复赛游记

文章目录Day0Day\ 0Day 0Day1Day\ 1Day 1Day2Day\ 2Day 2总结:csp−J:csp-J:csp−J:csp−s:csp-s:csp−s:遥远的梦想&#xff1a;Day0Day\ 0Day 0 早上&#xff0c;在运动会上乱搞一波&#xff0c;然后在10点左右到了机房&#xff0c;然后发现巨佬几枚&#xff0c;远看似在认证…

Rainbond v3.7.0:实现企业级PaaS的稳定性

Rainbond v3.7.0&#xff1a;实现企业级PaaS的稳定性Rainbond在v3.7.0版本中释出了大量平台稳定性更新&#xff0c;并在应用管理功能、安全性和系统安装三方面进行了部分优化。作为IT基础系统平台&#xff0c;Rainbond从低耦合的架构设计、高可用的部署方式、自恢复与容错的设计…

简单多边形三角化(暴力)

简单多边形三角化(暴力) 说在前面 网上流传着各种神奇的多边形三角剖分算法&#xff0c;但是讲道理&#xff0c;实现难度太高了。。。也没有搜到其他人的实现。这里写个最暴力的做法。。随机数据验证没问题&#xff0c;欢迎 hack 实现 一个简单多边形的耳朵定义为&#xff1a;如…

牛客网【每日一题】4月13号 Accumulation Degree

文章目录题目描述样例分析&#xff1a;题意&#xff1a;题解&#xff1a;代码&#xff1a;本题目传送题目树学是这个题的简易版&#xff0c;也涉及换根问题&#xff0c;可以先看看这个 树学 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768…

微软把UWP定位成业务线应用程序开发平台

微软把UWP定位成传统业务线&#xff08;LOB&#xff09;应用程序开发平台&#xff0c;以使用Windows Template Studio实现快速应用程序开发为重点。但是&#xff0c;为了把LOB开发人员吸引到UWP平台&#xff0c;他们在做的事情不止这些。最初发布时&#xff0c;通用Windows平台…

读 《CSharp Coding Guidelines》有感

C# 编程指南前不久在 Github 上看见了一位大牛创建一个仓库&#xff1a;CSharpCodingGuidelines&#xff0c;打开之后看了一下 readme.md 相关描述&#xff0c;感觉应该很不错&#xff0c;于是就 clone 到本地拜读一下&#xff0c;这里列一些自己的笔记&#xff0c;方便日后回顾…

牛客网 【每日一题】4月10日 二分图染色(弱化版)

精讲 组合、容斥 文章目录题目&#xff1a;题意&&题解&#xff1a;&#xff1a;代码&#xff1a;题目传送题目&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld …

微软Windows Community Toolkit一览

为了满足业务线开发人员的需求&#xff0c;微软推出了Windows Community Toolkit。这个快速变化的库充当了新的UWP控件和功能的测试基础。在创建UWP之初&#xff0c;其重点目标是智能手机和平板电脑。这意味着大部分开发预算都花费在控件上&#xff0c;确保这些控件能够在有限的…

如何简单的在 ASP.NET Core 中集成 JWT 认证?

前情提要&#xff1a;ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统文章超长预警&#xff08;1万字以上&#xff09;&#xff0c;不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包自上一篇介绍如何在 ASP.NET Core 中集成 JWT 的博文发布…

【二分】【暴力】蛋糕(gmoj 3918)

蛋糕 gmoj 3918 题目大意&#xff1a; 有一个蛋糕&#xff0c;分成n∗mn*mn∗m个单位&#xff0c;现在横竖各切三刀&#xff0c;使其分成16个矩阵&#xff0c;使价值最小的矩阵价值最大 输出样例 5 5 95998 21945 23451 99798 74083输入样例 3数据范围 40%的数据&#x…

Music Problem

文章目录题目描述题意&#xff1a;题解&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 Listening to the music is relax, but for obsessive(强迫症), it …

可扩展架构设计的三个维度

业界对于可扩展的系统架构设计有一个朴素的理念,就是&#xff1a;通过加机器就可以解决容量和可用性问题这一理念在“云计算”概念疯狂流行的今天&#xff0c;得到了广泛的认可&#xff01;对于一个规模迅速增长的系统而言&#xff0c;容量和性能问题当然是首当其冲的。但是随着…

.NET Core开发日志——简述路由

有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由&#xff0c;可以这样形容&#xff1a;通过对URL的解析&#xff0c;指定相应的处理程序。回忆下在Web Forms应用程序中使用路由的方式&#xff1a;然后是MVC应用程序&…

博客开通

开通博客第一天&#xff0c;纪念一下——

.NetCore Cap 结合 RabbitMQ 实现消息订阅

开源分布式消息框架 Cap 可以在GitHub上拉也可以通过nuget添加上一篇博文写了 Windows RabbitMQ的安装使用 Cap支持事务&#xff0c;通过捕获数据库上下文连接对象实现 消息事务&#xff0c;消息持久化怎么来实现消息订阅 消费&#xff1f;使用起来非常简单&#xff0c;主要通过…

小H和游戏

文章目录题目描述题解&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小H正在玩一个战略类游戏&#xff0c;她可以操纵己方的飞机对敌国的N座城市(编号为1~N…

asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

在 asp.net core 发布时&#xff0c;本人先后产生了3个疑问。1、发布的程序为什么不能在docker容器中运行当时在window开发环境中发布后&#xff0c;dotnet xxx.dll可以正常运行&#xff1b;但放入docker容器后就报 *.*.deps.json not found 的错误。后根据下面的文章解决了问题…

水题(water)(非详细解答)

传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 其中&#xff0c;f(1)1;f(2)1;Z皇后的方案数&#xff1a;即在ZZ的棋盘上放置Z个皇后&#xff0c;使其互不攻击的方案数。…

网络流小结

最大流&#xff1a; EK算法&#xff1a; #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int inf0x7fffffff; const int maxn10010; struct node{int u,v,f,next; }edge[300050]; int s,t,cnt,…

.NET MVC CSRF/XSRF 漏洞

最近我跟一个漏洞还有一群阿三干起来了……背景&#xff1a;我的客户是一个世界知名的药企&#xff0c;最近这个客户上台了一位阿三管理者&#xff0c;这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍。由于我们的客户关系维护的非常好&#xff0c;直接对口人提前透…