首页 > 其他分享 >树的直径

树的直径

时间:2024-06-05 21:58:54浏览次数:6  
标签:int ed beg 直径 DP dis

树的直径可能不是唯一的,但树的中点是唯一的,我的意思是..

U81904 【模板】树的直径


有以下两种办法求得树的直径:

  1. 两遍 DFS(或BFS):可以记录点
  2. 树形 DP:允许有负边权

首先是 两遍 DFS 可求路径

点击查看代码
int head[N], cnt;
struct Edge {
    int from, to, nxt;
    ll val;
}e[N << 1];
void add(int u, int v, ll val){
    e[++cnt].from = u;
    e[cnt].to = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
    e[cnt].val = val;
}

ll dis[N], fa[N];
void dfs(int u, int father, ll d){
    fa[u] = father;
    dis[u] = d;
    for(int i = head[u]; i != 0; i = e[i].nxt){
        int v = e[i].to;
        if(v == father) continue;
        dfs(v, u, d + e[i].val);
    }

}
ll max_len(int &beg, int &ed){
    dfs(1, -1, 0);
    beg = 1;
    for(int i = 1; i <= n; i++){
        if(dis[i] > dis[beg]) beg = i;
    }
    dfs(beg, -1, 0);
    for(int i = 1; i <= n; i++){
        if(dis[i] > dis[ed]) ed = i;
    }
    return dis[ed];
}

然后是 树形DP 做法,可以维护负边权

点击查看代码
int head[N], cnt;
struct Edge {
    int from, to, nxt;
    ll val;
}e[N << 1];
void add(int u, int v, ll val){
    e[++cnt].from = u;
    e[cnt].to = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
    e[cnt].val = val;
}
ll dp[N], maxlen;
bool vis[N];

void dfs(int u){
    vis[u] = true;
    for(int i = head[u]; i != 0; i = e[i].nxt){
        int v = e[i].to;
        if(vis[v]) continue;
        dfs(v);
        maxlen = max(maxlen, dp[u] + dp[v] + e[i].val);
        dp[u] = max(dp[u], dp[v] + e[i].val);
    }
    return ;
}

标签:int,ed,beg,直径,DP,dis
From: https://www.cnblogs.com/9102qyy/p/18218694

相关文章

  • CF911F-构造、树直径
    link:https://codeforces.com/contest/911/problem/F给一棵树,你需要进行若干次操作:选择两个叶子,把他们的距离加入得分,删掉其中一个叶子。希望让最终得分最大。构造方案。删叶子,距离最大,考虑树的直径很明显用树的直径不会让答案更劣(一棵树可能有多个直径,但直径的中心是唯一的,在......
  • CF1943C-构造、树直径
    link:https://codeforces.com/contest/1943/problem/C题意:给一棵树,初始所有点为白色,每次操作可以选一个点\(v\),和一个距离\(d\),表示将所有距离点\(v\)恰好\(d\)的点染成黑色,问最少需要几次操作让树全黑,给出操作序列。树、二分图、黑白染色一条链怎么做?\(s_1,\dots,s_n\)......
  • 关于树的直径的一切
    观前须知本文使用CCBY-NC-SA4.0许可本文所有详细证明可见OIWiki笔者的博客主页正文定义树的直径指树上任意两点间距离的最大值两次DFS先以任意点为根找到最远点\(v\)再以\(v\)为根找到最远点\(u\)\(u-v\)即为该树的一条直径适用范围:无负权树证明:当\(v\)......
  • LeetCodeHot100 二叉树 94. 二叉树的中序遍历 104. 二叉树的最大深度 101. 对称二
    94.二叉树的中序遍历https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=study-plan-v2&envId=top-100-liked//递归//List<Integer>resList;//publicList<Integer>inorderTraversal(TreeNoderoot){//re......
  • CF1943C - Tree Compass | 树的直径 思维
    links给定一棵\(n\)个点的树,可以执行任意次以下操作:选定一个距离\(u\),并将与\(u\)距离为\(d\)的点都染色。求使得所有节点都染上颜色的最小操作次数,并输出方案。\(n\leq2000\)看着数据范围,朝着\(O(n^2)\)的dp去想,但是没有想出来。然后又尝试大胆猜测,\(d\)只......
  • 【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式
    [蓝桥杯2013省A]大臣的旅费题目描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同......
  • 力扣递归之 543. 二叉树的直径
    classSolution{//二叉树直径其实就是根到左子树最深+根到右子树最深  intdiameter;    publicintdiameterOfBinaryTree(TreeNoderoot){    calculateDepth(root);    returndiameter;  }    privateintcalculateDe......
  • 直径
    法一:先求出一条直径,显然只有这条直径上的边才可能是答案我们考虑最终答案怎么来的,我们把树看成这个样子其中中间红色的是我们找出来的直径那么其他直径只有可能是从分支开始走,然后到红色线上面走一段,最后再走到另一分支上(注意直径的端点都是叶子节点)我们把所有直径都画出来,每......
  • 动态树直径小记
    本文采用BY-NC-SA协议发布。要求:给你一棵树,边带权,每次断边连边(保证合法且仍是树),在线求每次修改后的直径。LCT(咕)TopTree拆边,然后用negiizhao论文里的方法维护。实现时注意,翻转标记会影响合并的信息,要swap一下。#include<iostream>#include<unordered_map>#includ......
  • 用MATLAB创建一个矩阵,包含颗粒的ID,type,直径,密度,坐标等信息,并填充一个矩形的空间
    LIGGGHTS可以read_data命令通过读取.txt文件中的颗粒信息。.txt的内容参考链接:liggghts通过.txt文件导入颗粒信息。下面的MATLAB代码可以根据需要生成一系列的颗粒信息,包括颗粒的ID,type,diameter,density,coordinate等。颗粒数量为8000,并且能够填充一个范围在(x_min,y_min,z_min)到(......