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;
    }
  • 相关阅读:
    组合数计算
    使用叉积判断两条直线是否相交
    关于括号的简单模拟题
    链表
    长句拆单词
    第九章 SpringCloud之Zuul路由
    第八章 SpringCloud之Feign、Hystrix结合使用
    第七章 SpringCloud之非声明式RestClient:Feign
    第六章 SpringCloud之Ribbon负载均衡
    第五章 SpringCloud之Eureka-Client使用RestTemplate实现服务之间的调用
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5187052.html
Copyright © 2011-2022 走看看