wordpress 跨站,搜索视频 网站开发,广东省建设工程总监扣分查询网站,seo网络推广优势引入
树是一种特殊的图#xff0c;因其看起来像一颗倒挂的树而得名。 树的定义为#xff1a;nnn个点n−1n-1n−1条边的无向连通图。
树的直径
定义树上任意两点之间最长的简单路径为树的直径#xff0c;一棵树可能有很多直径#xff0c;如菊花图等。
DFS求法
在没有负…引入树是一种特殊的图因其看起来像一颗倒挂的树而得名。树的定义为n nn个点n − 1 n-1n−1条边的无向连通图。树的直径定义树上任意两点之间最长的简单路径为树的直径一棵树可能有很多直径如菊花图等。DFS求法在没有负边权的情况下我们一般使用两次DFS求树的直径第一次DFS从任意位置出发找到距离起点最远的点x x xxxx是一条直径的端点之一第二次DFS从点x xx出发找到距离点x xx最远的点y yyx xx到y yy的路径即为一条直径。树形DP当图中存在负边权时无法使用DFS算法求解最长路径。此时应采用树形DP方法首先选取任意节点作为根节点对于每个节点x xx计算其子树中以x xx为顶点的最长路径。该路径长度等于x xx向下的最长路径与次长路径之和。在DFS遍历过程中只需维护这两个路径长度信息即可完成计算。实现voiddfs(intu,intfa){d1[u]d2[u]0;//d1是最长路d2是次长路for(intv:E[u]){if(vfa)continue;dfs(v,u);intdvd1[v]1;if(dvd1[u]){d2[u]d1[u];d1[u]dv;}elseif(dvd2[u]){d2[u]dv;}}ansmax(ans,d1[u]d2[u]);}树的重心要确定树的重心需选择一个根节点使其子树分布尽可能均匀。这里用最大子树的节点数来衡量均匀程度——该数值越小分布越均匀。因此使最大子树节点数最小的根节点即为树的重心。性质树的重心最多只有两个若有两个一定相邻。以重心作为根节点根节点的最大子树节点数不会超过n / 2 n/2n/2树上所有点到某个点的距离之和中到重心的最小。把两棵树用一条边连起来形成的新的树的重心在原来两树重心之间的路径上。在一颗树上添加一个叶子节点重心最多向叶子节点移动一条边。求法以任意节点为根进行DFS遍历可以计算每个节点的子树规模。具体而言向下递归时统计各子树节点数向上部分的大小可通过公式n-size[cur]求得实现voiddfs(intx,intfa){for(intv:E[x]){if(vfa)continue;dfs(v,x);sz[x]sz[v];mx[x]max(mx[x],sz[v]);//向下子树大小}sz[x];mx[x]max(mx[x],n-sz[x]);//向上子树大小}树的中心树的中心指的是树中某个特殊节点当以其为根时能使得从该节点出发的最长路径长度达到最小。它具有以下关键特性树的中心数量不超过两个且若存在两个中心则必定相邻中心必然位于树的直径路径上中心到任意节点的距离不超过树直径的一半所有节点到其最远点的路径必然经过中心求解步骤计算最长路径采用深度优先搜索(DFS)算法为每个节点计算其作为根时的最长路径和次长路径计算外部路径通过换根动态规划技术计算每个节点在其子树之外的最长路径确定中心节点对每个节点求取其最长路径与外部路径的最大值其中最小值对应的节点即为树的中心#includebits/stdc.husingnamespacestd;vectorintE[100005];intn,dp1[100005],dp2[100005],p1[100005],p2[100005],up[100005];voiddfs(intx,intfa){for(inti0;iE[x].size();i){intvE[x][i];if(vfa)continue;dfs(v,x);intsdp1[v]1;if(sdp1[x]){dp2[x]dp1[x];dp1[x]s;p2[x]p1[x];p1[x]v;}elseif(sdp2[x]){dp2[x]s;p2[x]v;}}}voiddfs1(intx,intfa){for(inti0;iE[x].size();i){intvE[x][i];if(vfa)continue;if(vp1[x]){up[v]max(dp2[x],up[x])1;}else{up[v]max(dp1[x],up[x])1;}dfs1(v,x);}}intmain(){cinn;for(inti1;in;i){intu,v;cinuv;E[u].push_back(v);E[v].push_back(u);}dfs(1,0);dfs1(1,0);intmnINT_MAX;for(inti1;in;i){mnmin(mn,max(dp1[i],up[i]));}for(inti1;in;i){if(max(dp1[i],up[i])mn){couti ;}}return0;}