基础算法 846.树的重心(数组模拟邻接表)

用一个数组h[ ]储存图中的节点。

每个节点引出一个链表,表明从这个点连接出去的边。

类似 模拟散列表中的拉链法。

由于树是一个无权图。

所以在建立树时使用add(a, b)和add(b, a)。

ne[ ]表示一个顶点指向的下一个顶点的指针。

e[ ]表示当前节点idx,点的序号。

1
2
3
add(int a, int b){
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<cstring>
using namespace std;
 
const int N = 100010, M = N * 2;
int h[N], ne[M], e[M], ans = N, idx, n;
bool state[N];
 
void add(int a, int b){
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
 
int dfs(int u){
     
    state[u] = true;
     
    int sum = 1, res = 0;
    for(int i = h[u]; i != -1; i = ne[i]){
         
        int j = e[i];
         
        if(!state[j]){
            int s = dfs(j);
            res = max(res, s);
            sum += s;
        }
    }
    res = max(res, n - sum);
    ans = min(res, ans);
    return sum;
}
 
int main(){
    cin >> n;
    memset(h, -1, sizeof h);
     
    for(int i = 0; i < n - 1; i ++ ){
        int a, b;
        cin >> a >> b;
        add(a, b),add(b, a);
    }
    dfs(1);
    cout << ans;
    return 0;
}

  

posted @   bz-2021  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示