Centroid - SGU 134(树的搜索)

题目大意:给你一个树,树每个点都有一个值, 这个点的的值就等于所有儿子里面点最多的那个儿子,值最小的就叫做重心,求出重心,还有所有等于重心的点,按照升序输出。

分析:就是一个简单的搜索树,求出来最大的儿子点数就行......

=============================================================================================================================

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;

const int MAXN = 16007;

int val[MAXN], MinVal, cnt, N;
bool used[MAXN];
vector<int> G[MAXN];

int DFS(int k)
{
    int sumSon = 0;

    for(int i=0; i<G[k].size(); i++)
    {
        int v = G[k][i];
        if(!used[v])
        {
            used[v] = true;
            int son = DFS(v);
            val[k] = max(val[k], son);
            sumSon += son;
        }
    }

    val[k] = max(val[k], N-sumSon-1);
    if(MinVal > val[k])
    {
        MinVal = val[k];
        cnt = 1;
    }
    else if(MinVal == val[k])
        cnt++;

    return sumSon + 1;
}

int main()
{
    int u, v;

    scanf("%d", &N);

    for(int i=1; i<N; i++)
    {
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
        G[v].push_back(u);
    }

    MinVal = MAXN;
    used[1] = true;
    DFS(1);

    printf("%d %d\n", MinVal, cnt);

    int flag=0;
    for(int i=1; i<=N; i++)
    {
        if(val[i] == MinVal)
        {
            if(flag++)printf(" ");
            printf("%d", i);
        }
    }
    printf("\n");

    return 0;
}

 

posted @ 2015-10-05 19:25  无忧望月  阅读(204)  评论(0)    收藏  举报
levels of contents