Algorithm14.7 树的图解法

[TOC]

树的图解法

树【不仅限于二叉树,多叉树都没问题的】转化为图【无向图】

  • 树的深度:【图中其他所有点】 离 【根节点对应的图中的节点】 距离最远的
  • 树的宽度:图中距离 【根节点对应的图中的节点】 各个不同距离中,个数最多的点(例如,距离为1的点有2个,距离为2的点有3个,距离为3的点有1个,所以宽度为3)
  • LCA问题:可以通过图论中的最短路来解决=》floyd直接暴力出来

基础转换

https://www.luogu.com.cn/problem/P3884

#include <iostream>
using namespace std;
const int maxn = 105;
const int inf = 1e8+9;
int n, d[maxn][maxn], ta, tb, depth, w[maxn], width = 1, ans;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            if (i != j) d[i][j] = inf;
    for (int i = 1; i < n; ++i) {
        scanf("%d%d", &ta, &tb);
        d[ta][tb] = 1; d[tb][ta] = 2;
    }
    for (int k = 1; k <= n; ++k)
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
    scanf("%d%d", &ta, &tb);
    for (int i = 1; i <= n; ++i) {
        depth = max(depth, d[1][i]);
        w[d[1][i]]++;
    }
    for (int i = 1; i <= depth+1; ++i) width = max(width, w[i]);
    printf("%d\n%d\n%d\n", depth+1, width, d[ta][tb]);
    return 0;
}

Posted on Feb 1, 2021