zoukankan      html  css  js  c++  java
  • Centroid

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

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

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

    #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
    ", MinVal, cnt);
    
        int flag=0;
        for(int i=1; i<=N; i++)
        {
            if(val[i] == MinVal)
            {
                if(flag++)printf(" ");
                printf("%d", i);
            }
        }
        printf("
    ");
    
        return 0;
    }
  • 相关阅读:
    独立人格,让人生更美好
    版本控制入门简介
    Android蓝牙操作
    Android Rect和RectF的区别
    做个环保主义的程序员
    java/android下JNI编程总结
    别太单纯,也别太不单纯
    C++ namespace的用法
    JNI编程
    企业架构 - 架构原则
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4856148.html
Copyright © 2011-2022 走看看