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);
    	}
    }
    
  • 相关阅读:
    64最长和谐子序列(594)
    63找到字符串中所有字母异位词(438)
    62有效的数独(36)
    10.10
    9.27作业
    9.27
    9.26
    9.25
    9.18学习内容
    9.17作业
  • 原文地址:https://www.cnblogs.com/hellohhy/p/13663144.html
Copyright © 2011-2022 走看看