zoukankan      html  css  js  c++  java
  • DP求树的重心

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int maxx =  200000+5;
    vector<int>G[maxx];
    int d[maxx];//保存的是当前节点的儿子节点数目
    int vis[maxx];
    int sum,num,n;
    void dfs(int x)
    {
        vis[x]=1;
        int num_son=1;
        for (int i=0; i<G[x].size(); i++)
        {
            int now=G[x][i];//当前访问的节点
            if(!vis[now]) //如果没有访问
            {
                dfs(now);//DFS
                d[x]+=(d[now]+1);//D[now]保存的是now的儿子节点个数,+1就是当前节点的儿子节点个数
                num_son=max(d[now]+1,num_son);//取大的
            }
        }
        num_son=max(num_son,n-d[x]-1);
        if (num_son<sum || (num_son==sum && x<num))//维护
        {
            sum=num_son;
            num=x;
        }
        return ;
    }
    int main()
    {
        int t,u,v;
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            memset(d,0,sizeof(d));
            for (int i=1; i<=n; i++)
            {
                G[i].clear();
            }
            memset(vis,0,sizeof(vis));
            scanf("%d",&n);
            sum=n;
            num=1;
            for (int i=1; i<n; i++)
            {
                scanf("%d%d",&u,&v);
                G[u].push_back(v);
                G[v].push_back(u);
            }
            dfs(1);
            printf("%d %d
    ",num,sum);
        }
        return 0;
    }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    c++运算符优先级
    C++中宽字符类型(wchar_t)的编码
    标志寄存器综述
    ubuntu 更新源
    windows shell命令相关
    汇编语言-环境搭建(16位)
    linux配置ftp
    ssl协议相关
    boost相关
    ubuntu下编译protobuf
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/10555066.html
Copyright © 2011-2022 走看看