链接: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使用一次魔法棒最多可以摘到多少桃花。

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

-->

示例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+;
struct node{
int to,next;
}edge[*maxn];
int cnt=;
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]=;
for(int i=head[x];i;i=edge[i].next)
{
if(!vis[edge[i].to])
{
dis[edge[i].to]=dis[x]+;
dfs(edge[i].to);
}
}
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dis[]=;
dfs();
int pos=;
for(int i=;i<=n;i++)
{
if(dis[i]>dis[pos])
pos=i;
}
memset(vis,,sizeof(vis));
dis[pos]=;
dfs(pos);
int ans=;
for(int i=;i<=n;i++)
{
if(dis[i]>ans)
ans=dis[i];
}
printf("%d\n",ans);
}
}

BFS代码

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

牛客小白月赛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. [转帖]ulimit、limits.conf、sysctl和proc文件系统

    ulimit.limits.conf.sysctl和proc文件系统 来源:https://blog.csdn.net/weixin_33918114/article/details/86882372 ...

  2. [转帖]TLS 1.3 VS TLS 1.2,让你明白 TLS 1.3 的强大

    TLS 1.3 VS TLS 1.2,让你明白 TLS 1.3 的强大 https://www.jianshu.com/p/efe44d4a7501?utm_source=oschina-app 又拍 ...

  3. [转帖]CentOS 6 服务器安全配置指南(通用)

    CentOS 6 服务器安全配置指南(通用) http://seanlook.com/2014/09/07/linux-security-general-settings/  发表于 2014-09- ...

  4. spring IOC源码分析(ApplicationContext)

    在上一篇文章中,我们以BeanFactory这条主线进行IOC的源码解析的,这里,将以ApplicationContext这条线进行分析.先看使用方法: @Test public void testA ...

  5. Python基础知识1-基础语法

    pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类  低级语言到高级语言 高级语言 程序Pr ...

  6. Laravel数据库操作的三种方式

    http://blog.csdn.net/zls986992484/article/details/52824962

  7. Django--CRM--菜单展示, 删除合并, 权限展示

    一 . 菜单展示 二 . 合并删除 我们可以把所有的删除都合并成一个函数这样就会减少很多的代码. 思路: 在url里面需要传两个参数,一个是要删的id 一个是名字 三 .权限展示 我们要实现两个功能 ...

  8. Appium之编写H5应用测试脚本(切换到Webview)

    App使用H5编写,默认方式找不到元素.启动后获取所有上下文,找到webivew_xxxx的,然后进行切换. 源码: package MyAppium; import io.appium.java_c ...

  9. 三、Docker网络

    一.查看8001端口是否开启处监听状态 netstat -apnl | grep 8001 二.使用brctl show可以看到虚拟机的网络关系 brctl show docker每新建一个conta ...

  10. SharePoint Server 2016 - Configure Office Online Server

    Step 1: Create the binding between SharePoint 2016 and Office Web Apps Server   To get started, open ...