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

来源:牛客网

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

题目描述

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

                                        ——《题百叶桃花》

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

输入描述:

  1. 第一行有一个正整数n,表示桃树的节点个数。
    接下来n-1行,第i行两个正整数a

i

  1. ,b

i

  1. ,表示桃树上的节点a

i

  1. ,b

i

  1. 之间有一条边。

输出描述:

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

输入例子:
  1. 3
  2. 1 2
  3. 2 3
输出例子:
  1. 3

-->

示例1

输入

复制

  1. 3
  2. 1 2
  3. 2 3

输出

复制

  1. 3
示例2

输入

复制

  1. 3
  2. 1 2
  3. 1 3

输出

复制

  1. 3
示例3

输入

复制

  1. 4
  2. 1 2
  3. 2 3
  4. 3 4

输出

复制

  1. 4

备注:

  1. 对于100%的测试数据:
    1 n 1000000
    数据量较大,注意使用更快的输入输出方式。
  2.  
  3. 解题思路:求树直径的裸题,两遍dfs,第⼀遍从任⼀点开始,找到距这个点最远的点,他⼀定是直径的⼀端,然 后从这个点开始再dfs,找到最远的距离,输出即可。可以用DFS,也可以用BFS,节点数比较多,需要用链式前向星的方法存储边。
    DFS代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=1e6+;
  5. struct node{
  6. int to,next;
  7. }edge[*maxn];
  8. int cnt=;
  9. int vis[maxn],head[maxn],dis[maxn];
  10.  
  11. void add(int u,int v)
  12. {
  13. edge[++cnt].to=v;
  14. edge[cnt].next=head[u];
  15. head[u]=cnt;
  16. }
  17.  
  18. void dfs(int x)
  19. {
  20. vis[x]=;
  21. for(int i=head[x];i;i=edge[i].next)
  22. {
  23. if(!vis[edge[i].to])
  24. {
  25. dis[edge[i].to]=dis[x]+;
  26. dfs(edge[i].to);
  27. }
  28. }
  29. }
  30.  
  31. int main()
  32. {
  33. int n;
  34. while(scanf("%d",&n)!=EOF)
  35. {
  36. memset(head,-,sizeof(head));
  37. memset(vis,,sizeof(vis));
  38. memset(dis,,sizeof(dis));
  39. for(int i=;i<n;i++)
  40. {
  41. int u,v;
  42. scanf("%d%d",&u,&v);
  43. add(u,v);
  44. add(v,u);
  45. }
  46. dis[]=;
  47. dfs();
  48. int pos=;
  49. for(int i=;i<=n;i++)
  50. {
  51. if(dis[i]>dis[pos])
  52. pos=i;
  53. }
  54. memset(vis,,sizeof(vis));
  55. dis[pos]=;
  56. dfs(pos);
  57. int ans=;
  58. for(int i=;i<=n;i++)
  59. {
  60. if(dis[i]>ans)
  61. ans=dis[i];
  62. }
  63. printf("%d\n",ans);
  64. }
  65. }

BFS代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=1e6+;
  5. struct node{
  6. int to,next;
  7. }edge[*maxn];
  8. int cnt=,ans;
  9. int vis[maxn],head[maxn],dis[maxn];
  10. queue<int> que;
  11.  
  12. void add(int u,int v)
  13. {
  14. edge[++cnt].to=v;
  15. edge[cnt].next=head[u];
  16. head[u]=cnt;
  17. }
  18.  
  19. int bfs(int x)
  20. {
  21. memset(vis,,sizeof(vis));
  22. dis[x]=;
  23. que.push(x);
  24. while(!que.empty())
  25. {
  26. int p=que.front();
  27. que.pop();
  28. for(int i=head[p];i!=-;i=edge[i].next)
  29. {
  30. if(!vis[edge[i].to])
  31. {
  32. dis[edge[i].to]=dis[p]+;
  33. que.push(edge[i].to);
  34. vis[edge[i].to]=;
  35. ans=max(ans,dis[edge[i].to]);
  36. }
  37. }
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43. int n;
  44. while(scanf("%d",&n)!=EOF)
  45. {
  46. memset(head,-,sizeof(head));
  47. memset(dis,,sizeof(dis));
  48. for(int i=;i<n;i++)
  49. {
  50. int u,v;
  51. scanf("%d%d",&u,&v);
  52. add(u,v);
  53. add(v,u);
  54. }
  55. ans=;
  56. bfs();
  57. int pos=;
  58. for(int i=;i<=n;i++)
  59. {
  60. if(dis[i]>dis[pos])
  61. pos=i;
  62. }
  63. ans=;
  64. bfs(pos);
  65. printf("%d\n",ans);
  66. }
  67. return ;
  68. }

牛客小白月赛6C-桃花(DFS/BFS求树的直径)的更多相关文章

  1. 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?

    牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...

  2. 牛客小白月赛12 I (tarjan求割边)

    题目链接:https://ac.nowcoder.com/acm/contest/392/I 题目大意:一个含有n个顶点m条边的图,求经过所有顶点必须要经过的边数. 例: 输入: 5 51 22 33 ...

  3. 牛客小白月赛5-I-区间(差分求前缀和+一次暴力统计)

    题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作: 操作一:将a[L]-a[R]内的元素都加上P 操作二:将a[L]-a[R]内的元素都 ...

  4. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

  5. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

  6. 牛客小白月赛18 Forsaken给学生分组

    牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 ​ Forsaken有 ...

  7. 牛客小白月赛18 Forsaken喜欢数论

    牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 ​ Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...

  8. 牛客小白月赛19 E 「火」烈火燎原 (思维,树)

    牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  9. 【牛客小白月赛21】NC201604 Audio

    [牛客小白月赛21]NC201604 Audio 题目链接 题目大意: 给出三点 ,求到三点距离相等的点 的坐标. 解析 考点:计算几何基础. 初中蒟蒻表示不会什么法向量.高斯消元..qwq 方法一: ...

随机推荐

  1. 双击启动tomcat中的startup.bat闪退原因及解决方法

    免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...

  2. 将Myeclipse项目改成Eclipse项目

    由于项目需求,需要将原来Myeclipse项目转移到Eclipse中去.搞了半天才搞出来,分享给大家,希望对大家有用. 首先导入一个从Myeclipse导出的项目 然后无法进行tomcat发布. 但是 ...

  3. java核心API学习

    1:java.lang  (Object.String.StringBuffer.Thread.System.ClassLoader.Class.Runtime.包装类等)

  4. scala下划线

    作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...

  5. 创建安全客户端Socket

    SocketFactory factory = SSLSocketFactory.getDefault(); Socket socket = factory.create("localhos ...

  6. dashboard使用与访问

    #dashboard的github地址 https://github.com/kubernetes/dashboard #下载 wget https://raw.githubusercontent.c ...

  7. 关于mysql远程登录问题

    问题:mysql不能实现远程登录 前提:mysql开启了远程登录账号,安全组也放行了3306,防火墙是iptables,也加入了3306放行,但是还是不能实现远程访问 解决办法,使用iptables ...

  8. java 静态成员访问

    public class MqConfig { @Getter private static IProducerProcessor callBackProducerRetry; @Getter @Va ...

  9. Java开发之@PostConstruct执行顺序

    构造函数==>postConstruct==>init==destory==>predestory==卸载servlet;; 从Java EE5规范开始,Servlet增加了两个影响 ...

  10. Python:matplotlib绘制直方图

    使用hist方法来绘制直方图:     绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色.类型参数: plt.hist(np.random.randn(1 ...