AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

寻找中心

作者: 作者的头像   acwing_41764 ,  2024-10-29 22:36:43 ,  所有人可见 ,  阅读 5


0


include [HTML_REMOVED]

include [HTML_REMOVED]

include [HTML_REMOVED]

using namespace std;

const int N = 100010;
bool state[N]; // 标记节点是否被访问
int n, ans = N; // 节点数和重心

struct Node {
int id; // 节点编号
int w; // 权值(如果需要)
Node* next; // 指向下一个节点

Node(int _id, int _w) : id(_id), w(_w), next(nullptr) {}

};

Node* head[N]; // 邻接表的头指针数组

void add(int a, int b) {
Node* node = new Node(b, 0); // 创建新节点
node->next = head[a]; // 将新节点插入到链表头
head[a] = node;

node = new Node(a, 0);         // 反向边
node->next = head[b];
head[b] = node;

}

int dfs(int u) {
state[u] = true;
int size = 0, sum = 1; // size: 最大子树大小, sum: 当前节点的子树大小

for (Node* v = head[u]; v != nullptr; v = v->next) {
    int j = v->id;  // 获取相邻节点编号
    if (state[j]) continue;
    int s = dfs(j);  // 递归 DFS
    size = max(size, s);  // 更新最大子树大小
    sum += s;             // 更新当前子树的大小
}

size = max(size, n - sum);  // 更新去掉当前节点后的最大子树大小
ans = min(size, ans);        // 更新全局最小值
return sum;                  // 返回当前子树大小

}

int main() {
cin >> n;
memset(head, 0, sizeof(head)); // 初始化头指针数组

int a, b;
for (int i = 0; i < n - 1; i++) {  // 树有 n-1 条边
    cin >> a >> b;
    add(a, b);
}

dfs(1);  // 从任意节点开始 DFS
cout << ans;  // 输出重心
return 0;

}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息