zoukankan      html  css  js  c++  java
  • poj1655 树重心

    题意:求树重心 如果存在2个重心 输出结点序号小的一个

    思路:板子题 注意在具有多个重心的时候判断一下选择结点序号小的作为答案就可以了

    AC代码:

    #include "iostream"
    #include "string.h"
    #include "stack"
    #include "queue"
    #include "string"
    #include "vector"
    #include "set"
    #include "map"
    #include "algorithm"
    #include "stdio.h"
    #include "math.h"
    #define ll long long
    #define bug cout<<"UUUUUUUU<<endl;
    #define mem(a) memset(a,0,sizeof(a))
    using namespace std;
    struct Edge{
        int to,next;
    };
    Edge e[100005];
    int head[100005],vis[100005],son[100005],n,cnt,ans,si;
    void Init(){
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
        cnt=0;
        ans=0;
        si=2000005;
    }
    void add(int u, int v){
        e[cnt].to=v;
        e[cnt].next=head[u];
        head[u]=cnt++;
    }
    void Dfs(int u){
        vis[u]=1;
        son[u]=0;
        int tmp=0;
        for(int i=head[u]; i!=-1; i=e[i].next){
            int v=e[i].to;
            if(vis[v]) continue;
            Dfs(v);
            son[u]+=son[v]+1;
            tmp=max(tmp,son[v]+1);
        }
        tmp=max(tmp,n-son[u]-1);
        if(si>tmp || (tmp==si && u<ans) ){
            ans=u;
            si=tmp;
        }
    }
    int main(){
        int t,a,b;
        scanf("%d",&t);
        while(t--){
            Init();
            scanf("%d",&n);
            for(int i=1; i<n; ++i){
                scanf("%d%d",&a,&b);
                add(a,b);
                add(b,a);
            }
            Dfs(1);
            printf("%d %d
    ",ans,si);
        }
       return 0;
    }
  • 相关阅读:
    (一)linux 系统命令与文件
    python(1)- 初识python
    四、计算机硬件知识整理
    三、计算机硬件历史
    二、网络基础之网络协议
    jmeter while循环使用
    gitlab分支管理
    gitlab基本操作
    JAVA多种向influxDB中插入数据方式
    JAVA类变量和实例变量
  • 原文地址:https://www.cnblogs.com/max88888888/p/6556478.html
Copyright © 2011-2022 走看看