zoukankan      html  css  js  c++  java
  • oj 22609 Balancing Act

    题意:给出一棵树,求树上一点使得使得删除一点后该树的最大子树最小。

    树的重心裸题,直接跑dfs,更新其最大子树大小

    #include<bits/stdc++.h>
    using namespace std;
    const int maxx = 20010;
    const int inf = 0x3f3f3f3f;
    int vis[maxx],son[maxx];
    int ans,d,n;
    vector<int>q[maxx];
    void dfs(int u)
    {
        vis[u]=1;son[u]=0;
        int temp=0;
        for(int i=0;i<q[u].size();i++)
        {
            int v=q[u][i];
            if(vis[v])continue;
            dfs(v);
            son[u]+=son[v]+1;
            temp=max(temp,son[v]+1);//求u为根时子树的最大值
        }
        temp=max(temp,n-son[u]-1);//父节点的那个子树
        if(temp<ans||(temp==ans&&u<d))
        {
            ans=temp;d=u;
        }
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            memset(son,0,sizeof(son));
            int a,b;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)q[i].clear();
            for(int i=1;i<n;i++)
            {
                scanf("%d%d",&a,&b);
                q[a].push_back(b);
                q[b].push_back(a);
            }
            d=0;ans=inf;
            dfs(1);
            printf("%d %d
    ",d,ans);
        }
        return 0;
    }
  • 相关阅读:
    自娱自乐
    项目冲刺(2)-第二、第三天
    项目冲刺(2)-第一天
    Beta版本冲刺计划及安排
    第一章 构造过程抽象
    python 学习2
    python 学习1
    ionic 初入门
    NodeJS学习
    软件工程实践总结作业——个人作业
  • 原文地址:https://www.cnblogs.com/HooYing/p/10948891.html
Copyright © 2011-2022 走看看