【图论】树的重心

 树的重心

删去这一点后每一块中点数最为平均

统计以u为根的子树点数个数(加上一个本身,从哪里来的),这里点都是一样的

s846. 树的重心 - AcWing题库 

#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f

using namespace std;
struct Edge{

int to;
int next;

}edge[200001];
int tot;
int n;
int head[100001];
bool st[100001];
int ans=INF;
//无向边

void add(int u,int v){
edge[++tot].next=head[u];
edge[tot].to=v;
head[u]=tot;

}


//返回以u为根的子树中节点的个数,包括u节点
int dfs(int u) {


    int res = 0; //存储 删掉某个节点之后,最大的连通子图节点数
    st[u] = true; //标记访问过u节点

	// sum用于记录根子树的个数
    int sum = 1; //存储 以u为根的树 的节点数, 包括u,如图中的4号节点

    //访问u的每个子节点
    for (int i = head[u];~i;i=edge[i].next) {
        int j = edge[i].to;
        //因为每个节点的编号都是不一样的,所以 用编号为下标 来标记是否被访问过
        if (!st[j]) {
            int s = dfs(j);  // u节点的单棵子树节点数 如图中的size值
            res = max(res, s); // 记录最大联通子图的节点数
            sum += s; //以j为根的树 的节点数
        }
    }

    //n-sum 如图中的n-size值,不包括根节点4;
    res = max(res, n - sum); // 选择u节点为重心,最大的 连通子图节点数
    ans = min(res, ans); //遍历过的假设重心中,最小的最大联通子图的 节点数
    return sum;
}

int main() {
    memset(head, -1, sizeof head); //初始化h数组 -1表示尾节点
    cin >> n; //表示树的结点数

    // 题目接下来会输入,n-1行数据,
    // 树中是不存在环的,对于有n个节点的树,必定是n-1条边
    for (int i = 0; i < n - 1; i++) {
        int a, b;
        cin >> a >> b;
        add(a, b), add(b, a); //无向图
    }

    dfs(1); //可以任意选定一个节点开始 u<=n

    cout << ans;

    return 0;
}

相关推荐

  1. 重心

    2024-06-05 21:48:04       27 阅读
  2. 2024-06-05 21:48:04       46 阅读
  3. 直径

    2024-06-05 21:48:04       55 阅读
  4. 直径(树形DP、BFS)

    2024-06-05 21:48:04       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 21:48:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 21:48:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 21:48:04       87 阅读
  4. Python语言-面向对象

    2024-06-05 21:48:04       96 阅读

热门阅读

  1. WebSocket

    WebSocket

    2024-06-05 21:48:04      30 阅读
  2. SRS、ZLMediakit音视频流媒体服务器

    2024-06-05 21:48:04       34 阅读
  3. CSS实现一个雨滴滑落效果

    2024-06-05 21:48:04       35 阅读
  4. jupyter notebook打开路径

    2024-06-05 21:48:04       33 阅读
  5. 掌握装饰器模式(具体例子)

    2024-06-05 21:48:04       28 阅读
  6. lua拼接字符串

    2024-06-05 21:48:04       28 阅读
  7. 如何有效屏蔽手机上的骚扰电话20240530

    2024-06-05 21:48:04       45 阅读
  8. [论文阅读] ZeRo

    2024-06-05 21:48:04       31 阅读
  9. 关于lua源代码中的EXTRA_STACK宏

    2024-06-05 21:48:04       30 阅读