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;
    }
  • 相关阅读:
    A 开场白 快速幂
    矩阵快速幂
    围棋棋盘有多少正方形 19*19
    matlab
    汉诺塔问题
    error C2504 base class undefined
    查看标准的FM以及描述等的一个数据…
    报表整合数据的时候,常见的模式:
    SQL执行顺序
    LIST&nbsp;BOX&nbsp;联动的实现
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5187052.html
Copyright © 2011-2022 走看看