牛客小白月赛6C-桃花(DFS/BFS求树的直径)
链接:https://www.nowcoder.com/acm/contest/136/C
来源:牛客网
空间限制: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
-->
备注:
- 对于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求树的直径)的更多相关文章
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
- 牛客小白月赛12 I (tarjan求割边)
题目链接:https://ac.nowcoder.com/acm/contest/392/I 题目大意:一个含有n个顶点m条边的图,求经过所有顶点必须要经过的边数. 例: 输入: 5 51 22 33 ...
- 牛客小白月赛5-I-区间(差分求前缀和+一次暴力统计)
题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作: 操作一:将a[L]-a[R]内的元素都加上P 操作二:将a[L]-a[R]内的元素都 ...
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- 牛客小白月赛8 - E - 诡异数字 数位DP
牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...
- 牛客小白月赛18 Forsaken给学生分组
牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 Forsaken有 ...
- 牛客小白月赛18 Forsaken喜欢数论
牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...
- 牛客小白月赛19 E 「火」烈火燎原 (思维,树)
牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- 【牛客小白月赛21】NC201604 Audio
[牛客小白月赛21]NC201604 Audio 题目链接 题目大意: 给出三点 ,求到三点距离相等的点 的坐标. 解析 考点:计算几何基础. 初中蒟蒻表示不会什么法向量.高斯消元..qwq 方法一: ...
随机推荐
- 双击启动tomcat中的startup.bat闪退原因及解决方法
免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...
- 将Myeclipse项目改成Eclipse项目
由于项目需求,需要将原来Myeclipse项目转移到Eclipse中去.搞了半天才搞出来,分享给大家,希望对大家有用. 首先导入一个从Myeclipse导出的项目 然后无法进行tomcat发布. 但是 ...
- java核心API学习
1:java.lang (Object.String.StringBuffer.Thread.System.ClassLoader.Class.Runtime.包装类等)
- scala下划线
作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...
- 创建安全客户端Socket
SocketFactory factory = SSLSocketFactory.getDefault(); Socket socket = factory.create("localhos ...
- dashboard使用与访问
#dashboard的github地址 https://github.com/kubernetes/dashboard #下载 wget https://raw.githubusercontent.c ...
- 关于mysql远程登录问题
问题:mysql不能实现远程登录 前提:mysql开启了远程登录账号,安全组也放行了3306,防火墙是iptables,也加入了3306放行,但是还是不能实现远程访问 解决办法,使用iptables ...
- java 静态成员访问
public class MqConfig { @Getter private static IProducerProcessor callBackProducerRetry; @Getter @Va ...
- Java开发之@PostConstruct执行顺序
构造函数==>postConstruct==>init==destory==>predestory==卸载servlet;; 从Java EE5规范开始,Servlet增加了两个影响 ...
- Python:matplotlib绘制直方图
使用hist方法来绘制直方图: 绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色.类型参数: plt.hist(np.random.randn(1 ...