NOIP 提高组初赛 · NOIP 2016 提高组初赛试题 第 26 题

选择题 · 答案 2 5 · 考点:输入输出、位运算、分支结构、循环结构、字符串(string)、STL容器基础

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#include <iostream>
#include <cstring>
using namespace std;
int map[100][100];
int sum[100], weight[100];
int visit[100];
int n;
void dfs(int node)
{
    visit[node] = 1;
    sum[node] = 1;
    int v, maxw = 0;
    for (v = 1; v <= n; v++)
    {
        if (!map[node][v] || visit[v])
            continue;
        dfs(v);
        sum[node] += sum[v];
        if (sum[v] > maxw)
            maxw = sum[v];
    }
    if (n - sum[node] > maxw)
        maxw = n - sum[node];
    weight[node] = maxw;
}
int main()
{
    memset(map, 0, sizeof(map));
    memset(sum, 0, sizeof(sum));
    memset(weight, 0, sizeof(weight));
    memset(visit, 0, sizeof(visit));
    cin >> n;
    int i, x, y;
    for (i = 1; i < n; i++)
    {
        cin >> x >> y;
        map[x][y] = 1;
        map[y][x] = 1;
    }
    dfs(1);
    int ans = n, ansN = 0;
    for (i = 1; i <= n; i++)
        if (weight[i] < ans)
        {
            ans = weight[i];
            ansN = i;
        }
    cout << ansN << " " << ans << endl;
    return 0;
}

输入:11 1 2 1 3 2 4 2 5 2 6 3 7 7 8 7 11 6 9 9 10 输出:_________

答案:2 5

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构字符串(string)STL容器基础 讲解 →STL容器基础 真题汇总 →

解题思维

看到 DFS 递归统计子树大小,最后对比 n-sum[node],立刻想到这是在算‘去根后最大连通块’。

常见错误

易错点:把 weight 误认为子树大小或整树深度;漏掉 n-sum[node] 导致算错最优根。

详细解析(节选)

考点:程序阅读(DFS 子树统计与最大连通块)

程序在做什么

从节点 1 开始 DFS,对每个点计算:去掉该点后,剩余图被切成的最大连通块大小,记为 weight[node]。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断