hihocoder #1224 : 赛车 dfs

#1224 : 赛车

Time Limit: 1 Sec

Memory Limit: 256 MB

题目连接

http://hihocoder.com/problemset/problem/1224

Description

幻想乡有一个赛车场。赛车场里有N个地点。同时地点之间还有单向的道路存在。

这些道路使得赛车场形成了一个外向树的结构。也就是说,道路将这N个地点连成了一个有根树。并且所有的边都是从父亲指向孩子的。

由于幽香喜欢刺激,每次她去赛车场都会从根节点出发,选择最长的一条路径来玩。

但是现在幽香感觉最长的路径还是太短了,她打算在赛车场里新建一条道路使得新的最长路径最长。

同时,如果道路形成了一个环,那么可能会出现交通事故,所以幽香新建的道路不能导致环的出现。

你能帮幽香算出新建一条道路后的最长路径吗?幽香知道根节点一定是1号点。

Input

一行一个数N,表示地点的数量。

接下来N-1行,每行两个数a和b,表示从点a到点b有一条单向路径。所有点从1到n标号。

数据范围:

n<=100000。

Output

一行表示新建一条边后的最长路径。

Sample Input

5
1 2
2 3
1 4
4 5

Sample Output

4

HINT

题意

题解:

http://media.hihocoder.com/contests/challenge14/hihoCoder-Challenge14-Solution.pdf

官方题解在上面

首先我们先dfs出最长链,然后我们正在dfs出每一个点能够最长延展多少

然后最后答案就是最长链的长度+最长延展多少就好了

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <bitset>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 120051
#define mod 10007
#define eps 1e-9
int Num;
//const int inf=0x7fffffff;   //нчоч╢С
const int inf=~0u>>1;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
//**************************************************************************************

vector<int> E[maxn];
int fa[maxn];
int dep[maxn];
int key[maxn];
void dfs(int x,int deep)
{
    dep[x]=deep;
    for(int i=0;i<E[x].size();i++)
    {
        int v=E[x][i];
        if(key[v])
            continue;
        fa[v]=x;
        dfs(v,deep+1);
    }
}
int main()
{
    int n=read();
    for(int i=1;i<n;i++)
    {
        int a=read(),b=read();
        E[a].push_back(b);
    }
    dfs(1,1);
    int mx=0,bj;
    for(int i=1;i<=n;i++)
    {
        if(dep[i]>mx)
        {
            mx=dep[i];
            bj=i;
        }
    }//找到最长链
    int ans=mx;
    int x = bj;
    while(x!=1)
    {
        key[x]=1;
        x=fa[x];
    }
    key[1]=1;
    for(int i=0;i<=n;i++)
    {
        if(key[i])
        {
            dfs(i,0);
        }
    }
    mx = 0;
    for(int i=1;i<=n;i++)
    {
        if(!key[i])
            mx = max(mx,dep[i]);
    }
    ans = max(0,ans+mx-1);
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-07 02:23:34

hihocoder #1224 : 赛车 dfs的相关文章

hihoCoder 1224 : 赛车

链接:http://hihocoder.com/problemset/problem/1224 //深搜一遍求最大深度,从最大深度的叶子回溯到根的所经过的每个顶点在深搜求最大深度 #include <iostream> #include <math.h> #include <stdio.h> #include <queue> #include <string.h> #include <algorithm> using namespac

DFS(深度) hihoCoder挑战赛14 B 赛车

题目传送门 题意:中文题面 分析:放官方题解,就是从1为根节点深搜记录节点的深度,选出最大的深度的点,将该到达该点的节点都vis掉,然后再重新计算没有vis的点的深度,找最大的相加就是答案.放张图好理解: 收获:计算树的节点的深度 代码: /************************************************ * Author :Running_Time * Created Time :2015-8-31 14:03:09 * File Name :B.cpp ***

hihoCoder挑战赛14-1224 赛车

题目链接 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幻想乡有一个赛车场.赛车场里有N个地点.同时地点之间还有单向的道路存在. 这些道路使得赛车场形成了一个外向树的结构.也就是说,道路将这N个地点连成了一个有根树.并且所有的边都是从父亲指向孩子的. 由于幽香喜欢刺激,每次她去赛车场都会从根节点出发,选择最长的一条路径来玩. 但是现在幽香感觉最长的路径还是太短了,她打算在赛车场里新建一条道路使得新的最长路径最长. 同时,如果道路形成了一个环,那么可能会出现交通事故

hihoCoder挑战赛14,题目2 : 赛车

题目2 : 赛车 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幻想乡有一个赛车场.赛车场里有N个地点.同时地点之间还有单向的道路存在. 这些道路使得赛车场形成了一个外向树的结构.也就是说,道路将这N个地点连成了一个有根树.并且所有的边都是从父亲指向孩子的. 由于幽香喜欢刺激,每次她去赛车场都会从根节点出发,选择最长的一条路径来玩. 但是现在幽香感觉最长的路径还是太短了,她打算在赛车场里新建一条道路使得新的最长路径最长. 同时,如果道路形成了一个环,那么可能会出现

hihocoder 1192 简单的树嵌入 (树上DFS 构造 好题)

#1192 : 简单的树嵌入 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个点的无权树.定义两点i,?j(0?≤?i,?j?≤?n?-?1)间的距离d(i,?j)为两点间树上最短路径的长度(边数). 我们需要将这n个点映射到中的向量v0?=?(v0,?0,?...,?v0,?m?-?1),?...,?vn?-?1?=?(vn?-?1,?0,?...,?vn?-?1,?m?-?1).定义两向量vi,?vj间的L1距离为 我们希望对于所有0?≤?i,?j?

hihocoder 1041 国庆出游 dfs

传送门:hihocoder 1041 给定一棵树,从节点1出发. 如今要求一种遍立方法,使得全部边都来回各走一遍,问在这样的条件下能否按指定顺序訪问部分点 比較巧妙的dfs深搜. 默认1为根节点,因此从1节点出发,预处理出每一个节点的子树中能达到的节点. 然后进行深搜,深搜策略例如以下: 对根节点開始,若找到某一个子节点能到达目标节点,且走向该节点的路径没有訪问过,则走向子节点继续深搜直至按指定顺序訪问全然部节点,或者某一节点已不可达 /*****************************

hihoCoder 1185 连通性&#183;三(Tarjan缩点+暴力DFS)

#1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出去,就拜托小Hi和小Ho忙帮放牧. 约翰家一共有N个草场,每个草场有容量为W[i]的牧草,N个草场之间有M条单向的路径. 小Hi和小Ho需要将牛羊群赶到草场上,当他们吃完一个草场牧草后,继续前往其他草场.当没有可以到达的草场或是能够到达的草场都已经被吃光了之后,小hi和小Ho就把牛羊群赶回家. 一开

hihoCoder挑战赛14 题目2 : 赛车 树的性质

题目2 : 赛车 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幻想乡有一个赛车场.赛车场里有N个地点.同时地点之间还有单向的道路存在. 这些道路使得赛车场形成了一个外向树的结构.也就是说,道路将这N个地点连成了一个有根树.并且所有的边都是从父亲指向孩子的. 由于幽香喜欢刺激,每次她去赛车场都会从根节点出发,选择最长的一条路径来玩. 但是现在幽香感觉最长的路径还是太短了,她打算在赛车场里新建一条道路使得新的最长路径最长. 同时,如果道路形成了一个环,那么可能会出现

hihoCoder#1185 : 连通性&#183;三 tarjan求强联通分量 缩点 dfs/拓扑排序求路径和最大值

题目链接: http://hihocoder.com/problemset/problem/1185# 题意: n个点,每个点有一个权值,m条有向边,从1出发,每走到一个点, 就吃掉这个点的草,当没有可以到达的草场或是能够到达的草场都已经被吃光了之后就要返回到1了.求最多可以吃掉多少草. 思路: 提示里面讲的挺好的 如果草场是一个强连通图,那么我们只要走到任意一点,就可以把其他所有的草场都走一遍,并且可以选择任意一个点作为终点.所以把强联通块缩成一个点 因为一个强连通块会被缩成一个点,那么我们可