#1224 : 赛车
2015-09-01 20:08
260 查看
幻想乡有一个赛车场。赛车场里有N个地点。同时地点之间还有单向的道路存在。
这些道路使得赛车场形成了一个外向树的结构。也就是说,道路将这N个地点连成了一个有根树。并且所有的边都是从父亲指向孩子的。
由于幽香喜欢刺激,每次她去赛车场都会从根节点出发,选择最长的一条路径来玩。
但是现在幽香感觉最长的路径还是太短了,她打算在赛车场里新建一条道路使得新的最长路径最长。
同时,如果道路形成了一个环,那么可能会出现交通事故,所以幽香新建的道路不能导致环的出现。
你能帮幽香算出新建一条道路后的最长路径吗?幽香知道根节点一定是1号点。
一行一个数N,表示地点的数量。
接下来N-1行,每行两个数a和b,表示从点a到点b有一条单向路径。所有点从1到n标号。
数据范围:
n<=100000。
一行表示新建一条边后的最长路径。
思路就是用DFS过程记录最大的深度,然后在找其他路的时候就加上这个深度,取最大值。
这些道路使得赛车场形成了一个外向树的结构。也就是说,道路将这N个地点连成了一个有根树。并且所有的边都是从父亲指向孩子的。
由于幽香喜欢刺激,每次她去赛车场都会从根节点出发,选择最长的一条路径来玩。
但是现在幽香感觉最长的路径还是太短了,她打算在赛车场里新建一条道路使得新的最长路径最长。
同时,如果道路形成了一个环,那么可能会出现交通事故,所以幽香新建的道路不能导致环的出现。
你能帮幽香算出新建一条道路后的最长路径吗?幽香知道根节点一定是1号点。
输入
一行一个数N,表示地点的数量。接下来N-1行,每行两个数a和b,表示从点a到点b有一条单向路径。所有点从1到n标号。
数据范围:
n<=100000。
输出
一行表示新建一条边后的最长路径。思路就是用DFS过程记录最大的深度,然后在找其他路的时候就加上这个深度,取最大值。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int M=100000+10; int e,head[M],nxt[M],pnt[M]; int n,m; int num[M],ans=0,imax=0; void AddEdge(int u,int v) { pnt[e]=v; nxt[e]=head[u]; head[u]=e++; } int dfs(int u,int deep) { //printf("!! %d\n",ans); //printf("%d %d %d\n",u,imax,deep); num[u]=1; ans=max(ans,deep+imax); for(int i=head[u];i!=-1;i=nxt[i]) { int v=pnt[i]; dfs(v,deep+1); num[u]=max(num[u],num[v]+1); imax=max(imax,num[u]-1); } // printf("%d %d\n",u,imax); } int main() { int u,v; scanf("%d",&n); e=0; memset(head,-1,sizeof(head)); memset(num,0,sizeof(num)); for(int i=1; i<n; i++) { scanf("%d%d",&u,&v); AddEdge(u,v); } dfs(1,1); printf("%d\n",ans-1); return 0; }
相关文章推荐
- 唯一索引、聚集索引和聚集索引
- hibernate tools连接数据报错
- 003-spark名词和架构介绍
- 笔记----------------------------------c++小知识
- TCP三次握手详解
- 用Python实现基本排序算法04——Shell排序
- Mybatis——SQL语句构建器类
- gy_sapling的博客
- Shell下不能使用Tab补全命令的原因
- Python 学习笔记-面向对象编程
- New Start
- 队列的链式表示
- 均值滤波、中值滤波【MATLAB】【图像处理】
- 如果要设计一个网络爬虫程序,该怎么避免陷入无限循环
- HDU 5014 Number Sequence
- UITableView <一>
- 002-mapreduce经典模型
- 封装
- [转载]Difference between <context:annotation-config> vs <context:component-scan>
- Android MediaExtractor setDataSource