zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 7 E. Ants in Leaves 贪心

    E. Ants in Leaves

    题目连接:

    http://www.codeforces.com/contest/622/problem/E

    Description

    Tree is a connected graph without cycles. A leaf of a tree is any vertex connected with exactly one other vertex.

    You are given a tree with n vertices and a root in the vertex 1. There is an ant in each leaf of the tree. In one second some ants can simultaneously go to the parent vertex from the vertex they were in. No two ants can be in the same vertex simultaneously except for the root of the tree.

    Find the minimal time required for all ants to be in the root of the tree. Note that at start the ants are only in the leaves of the tree.

    Input

    The first line contains integer n (2 ≤ n ≤ 5·105) — the number of vertices in the tree.

    Each of the next n - 1 lines contains two integers xi, yi (1 ≤ xi, yi ≤ n) — the ends of the i-th edge. It is guaranteed that you are given the correct undirected tree.

    Output

    Print the only integer t — the minimal time required for all ants to be in the root of the tree.

    Sample Input

    12
    1 2
    1 3
    1 4
    2 5
    2 6
    3 7
    3 8
    3 9
    8 10
    8 11
    8 12

    Sample Output

    6

    Hint

    题意

    每个叶子都有一个蚂蚁,然后蚂蚁会爬到根去,每秒可以爬一个节点

    然后每个节点的蚂蚁最多同时只有一个(除了根

    然后问你最少多久,可以使得所有蚂蚁都在根的位置

    题解:

    贪心就好了

    对于叶子,我们都记录下他们的深度,然后我们发现,如果存在两个叶子的深度相同,那么他们一定会相遇在某个点,所以我们只要使得某个点的深度+1就好了

    然后这样不断贪心下去就行了

    这个可以用桶排解决,反正最多1e6嘛

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6+7;
    vector<int> E[maxn];
    int dep[maxn];
    int cnt[maxn];
    vector<int> tmp;
    void dfs(int x,int fa)
    {
        if(E[x].size()==1)tmp.push_back(dep[x]);
        for(int i=0;i<E[x].size();i++)
        {
            int v = E[x][i];
            if(v==fa)continue;
            dep[v]=dep[x]+1;
            dfs(v,x);
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            E[x].push_back(y);
            E[y].push_back(x);
        }
        //cout<<endl;
        int ans = 0;
        for(int i=0;i<E[1].size();i++)
        {
            for(int j=0;j<=E[E[1][i]].size()+5;j++)
                cnt[j]=0;
            dep[E[1][i]]=1;
            tmp.clear();
            dfs(E[1][i],1);
            sort(tmp.begin(),tmp.end());
            int now = 0;
            for(int j=0;j<tmp.size();j++)
            {
                if(now>=tmp[j])now++;
                else now=tmp[j];
            }
            ans=max(ans,now);
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    3.8 java基础总结①多线程
    RPM Database 实战详解
    关于CentOS7.2 控制面板不显示输入法,或者无法调出输入的问题。(已解决)
    mysqldump
    一些有意思的Linux命令
    和docket的第一次亲密接触
    centos7根分区扩容(亲测有效)
    相识mongodb
    开机自动获取spark用户名和服务器
    Puppet日常总结
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5187052.html
Copyright © 2011-2022 走看看