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

    定义

    • 给定一棵树,树中最远的两个节点之间的距离被称为树的直径。

    求法

    一 : 两个循环求直径

    • 首先先求一个lca
    • 然后两遍for循环。
    int d1 = 1, d2 = 1, len = 0;
    for (int i = 1; i <= n; i++) {
    	if (i == d1) continue;
    	int dis = d[d1] + d[i] - 2 * d[lca(d1, i)];
    	if (dis > len) len = dis, d2 = i;
    }
    len = 0;
    for (int i = 1; i <= n; i++) {
    	if (i == d2) continue;
    	int dis = d[d2] + d[i] - 2 * d[lca(d2, i)];
    	if (dis > len) len = dis, d1 = i;
    }
    

    二 : 两个 spfa 或 dfs

    	spfa(1);
    	int p1 = 1;
    	for (int i = 1; i <= n; i++) if (d[i] > d[p1]) p1 = i;
    	spfa(p1);
    	int p2 = 1;
    	for (int i = 1; i <= n; i++) if (d[i] > d[p2]) p2 = i;
    	int diam = d[p2];
    

    树形dp求直径

    void dp(int x) {
    	vis[x] = 1;
    	for (int i = head[x]; i; i = e[i].next) {
    		int v = e[i].to;
    		if (vis[v]) continue;
    		dp(v);
    		ans = max(ans, d[x] + d[v] + e[i].dis);
          		d[x] = max(d[x], d[v] + e[i].dis);
    	}
    }
    
  • 相关阅读:
    做汉堡(续)
    做汉堡
    <构建之法>3-5章感想
    《构建之法》1-2章感想
    四则运算界面练习
    快速排序
    冒泡算法(思路1)
    希尔排序
    KMP算法
    1、基础算法题
  • 原文地址:https://www.cnblogs.com/hellohhy/p/13663144.html
Copyright © 2011-2022 走看看