首页 > 其他 > 详细

Centroid - SGU 134(树的搜索)

时间:2015-10-05 20:38:44      阅读:230      评论:0      收藏:0      [点我收藏+]

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

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

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

#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;
}

 

Centroid - SGU 134(树的搜索)

原文:http://www.cnblogs.com/liuxin13/p/4856148.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!