AcWing 846. 树的重心

题目链接:点击这里
AcWing 846. 树的重心_第1张图片
AcWing 846. 树的重心_第2张图片

#include
#include
#include
#include

using namespace std;

const int N = 100010, M = N * 2;

int n;
int h[N], e[M], ne[M], idx;
bool st[N];

int ans = N;

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

//返回以u为根的子树中点的数量
int dfs(int u)
{
     
    st[u] = true;       // 标记点u已经被遍历过
    
    int sum = 1;        //记录以u为根的子树中点的数量(初始为1表示包括该点)
    int res = 0;        //记录删掉该点后剩余各个连通块中点数的最大值
    
    for(int i = h[u]; i != -1; i = ne[i])
    {
     
        int j = e[i];
        if(!st[j])
        {
     
            int s = dfs(j);     //dfs以儿子为根的子树
            res = max(res, s);
            sum += s;
        }
    }
    
    res = max(res, n - sum);
    
    ans = min(ans, res);
    
    return sum;
}

int main()
{
     
    memset(h, -1, sizeof h);
    
    scanf("%d", &n);
    for(int i = 1; i <= n - 1; ++i)
    {
     
        int a, b;
        scanf("%d%d", &a, &b);
        add(a, b), add(b, a);
    }
    
    dfs(1);
    
    printf("%d\n", ans);
    
    return 0;
}

你可能感兴趣的:(图的遍历)