zoukankan      html  css  js  c++  java
  • 牛客小白月赛6C-桃花(DFS/BFS求树的直径)

    链接:https://www.nowcoder.com/acm/contest/136/C

    来源:牛客网

    桃花
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

        桃花一簇开无主,可爱深红映浅红。

                                            ——《题百叶桃花》

        桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。

    输入描述:

    第一行有一个正整数n,表示桃树的节点个数。
    接下来n-1行,第i行两个正整数a
    i
    ,b
    i
     ,表示桃树上的节点a
    i
    ,b
    i
    之间有一条边。

    输出描述:

    第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
    示例1

    输入

    复制
    3
    1 2
    2 3

    输出

    复制
    3
    示例2

    输入

    复制
    3
    1 2
    1 3

    输出

    复制
    3
    示例3

    输入

    复制
    4
    1 2
    2 3
    3 4

    输出

    复制
    4

    备注:

    对于100%的测试数据:
    1 ≤ n ≤ 1000000
    数据量较大,注意使用更快的输入输出方式。

    解题思路:求树直径的裸题,两遍dfs,第⼀遍从任⼀点开始,找到距这个点最远的点,他⼀定是直径的⼀端,然 后从这个点开始再dfs,找到最远的距离,输出即可。可以用DFS,也可以用BFS,节点数比较多,需要用链式前向星的方法存储边。
    DFS代码:
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+5;
    struct node{
        int to,next;
    }edge[2*maxn];
    int cnt=1;
    int vis[maxn],head[maxn],dis[maxn];
    
    void add(int u,int v)
    {
        edge[++cnt].to=v;
        edge[cnt].next=head[u];
        head[u]=cnt;
    }
    
    void dfs(int x)
    {
        vis[x]=1;
        for(int i=head[x];i;i=edge[i].next)
        {
            if(!vis[edge[i].to])
            {
                dis[edge[i].to]=dis[x]+1;
                dfs(edge[i].to);
            }
        }
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            memset(head,-1,sizeof(head));
            memset(vis,0,sizeof(vis));
            memset(dis,0,sizeof(dis));
            for(int i=1;i<n;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                add(u,v);
                add(v,u);
            }
            dis[1]=1;
            dfs(1);
            int pos=1;
            for(int i=1;i<=n;i++)
            {
                if(dis[i]>dis[pos])
                    pos=i;
            }
            memset(vis,0,sizeof(vis));
            dis[pos]=1;
            dfs(pos);
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                if(dis[i]>ans)
                ans=dis[i];
            }
            printf("%d
    ",ans);
        }
    }

    BFS代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+5;
    struct node{
        int to,next;
    }edge[2*maxn];
    int cnt=1,ans;
    int vis[maxn],head[maxn],dis[maxn];
    queue<int> que;
    
    void add(int u,int v)
    {
        edge[++cnt].to=v;
        edge[cnt].next=head[u];
        head[u]=cnt;
    }
    
    int bfs(int x)
    {
        memset(vis,0,sizeof(vis));
        dis[x]=1;
        que.push(x);
        while(!que.empty())
        {
            int p=que.front();
            que.pop();
            for(int i=head[p];i!=-1;i=edge[i].next)
            {
                if(!vis[edge[i].to])
                {
                    dis[edge[i].to]=dis[p]+1;
                    que.push(edge[i].to);
                    vis[edge[i].to]=1;
                    ans=max(ans,dis[edge[i].to]);
                }
            }
        }
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            memset(head,-1,sizeof(head));
            memset(dis,0,sizeof(dis));
            for(int i=1;i<n;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                add(u,v);
                add(v,u);
            }
            ans=0;
            bfs(1);
            int pos=1;
            for(int i=1;i<=n;i++)
            {
                if(dis[i]>dis[pos])
                pos=i;
            }
            ans=0;
            bfs(pos);
            printf("%d
    ",ans);
        }
        return 0;
    }

     

  • 相关阅读:
    561. Array Partition I
    448. Find All Numbers Disappeared in an Array
    136. Single Number
    485. Max Consecutive Ones
    463. Island Perimeter
    496. Next Greater Element I
    344. Reverse String
    【.net项目中。。】.net一般处理程序使用方法
    【ExtAspNet学习笔记】ExtAspNet控件库中常见问题
    用VS2010创建三层架构开发模式及三层架构的研究
  • 原文地址:https://www.cnblogs.com/zjl192628928/p/9508817.html
Copyright © 2011-2022 走看看