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

题目传送门

题意:中文题面

分析:放官方题解,就是从1为根节点深搜记录节点的深度,选出最大的深度的点,将该到达该点的节点都vis掉,然后再重新计算没有vis的点的深度,找最大的相加就是答案。放张图好理解:

收获:计算树的节点的深度

代码:

/************************************************
* Author        :Running_Time
* Created Time  :2015-8-31 14:03:09
* File Name     :B.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int dep[N];
bool vis[N];
vector<int> G[N];
int fa[N];

void DFS(int u, int d)  {
    dep[u] = d;
    for (int v, i=0; i<G[u].size (); ++i)  {
        v = G[u][i];
        if (vis[v]) continue;
        fa[v] = u;
        DFS (v, d + 1);
    }
}

int main(void)    {
    int n;  scanf ("%d", &n);
    for (int u, v, i=1; i<n; ++i)   {
        scanf ("%d%d", &u, &v);
        G[u].push_back (v);
    }
    fa[1] = 0;
    DFS (1, 0);

    int mx = 0, id = 0;
    for (int i=1; i<=n; ++i)    {
        if (mx < dep[i])    {
            mx = dep[i];    id = i;
        }
    }
    int ans = mx;
    while (id)  {
        vis[id] = true;
        id = fa[id];
    }
    for (int i=1; i<=n; ++i)    {
        if (vis[i]) {
            DFS (i, 0);
        }
    }
    mx = 0;
    for (int i=1; i<=n; ++i)    {
        if (!vis[i])    mx = max (mx, dep[i]);
    }
    printf ("%d\n", ans + mx);

    return 0;
}

  

时间: 2024-08-29 00:12:47

DFS(深度) hihoCoder挑战赛14 B 赛车的相关文章

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

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

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

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

hihoCoder挑战赛14 A,B,C题解

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目1 : 不等式 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定n个关于X的不等式,问最多有多少个成立. 每个不等式为如下的形式之一: X < C X <= C X = C X > C X >= C 输入 第一行一个整数n. 以下n行,每行一个不等式. 数据范围: 1<=N<=50,0<=C<=1000

hihoCoder挑战赛14 -1223

描述 给定n个关于X的不等式,问最多有多少个成立. 每个不等式为如下的形式之一: X < C X <= C X = C X > C X >= C 输入 第一行一个整数n. 以下n行,每行一个不等式. 数据范围: 1<=N<=50,0<=C<=1000 输出 一行一个整数,表示最多可以同时成立的不等式个数. 样例输入 4 X = 1 X = 2 X = 3 X > 0 样例输出 2 题目并没有要求X一定是整数.所以如果算法是枚举X然后统计成立的不等式数目

hihoCoder挑战赛14 题目1 : 不等式

题目1 : 不等式 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定n个关于X的不等式,问最多有多少个成立. 每个不等式为如下的形式之一: X < C X <= C X = C X > C X >= C 输入 第一行一个整数n. 以下n行,每行一个不等式. 数据范围: 1<=N<=50,0<=C<=1000 输出 一行一个整数,表示最多可以同时成立的不等式个数. 样例输入 4 X = 1 X = 2 X = 3 X >

DFS深度搜索的一般思想

对于无向图来说DFS深度搜索 递归思想 //深度优先搜索DFS的一般实现 void DFS(MGraph G,int i)//DFS递归思想 { int j; visited[i]=TRUE;//设置Node已经被访问 printf("%c",G.vexs[i]); for(j=0;j<numVertexes;j++)//对此Node跟Node2(j)遍历 如果arc[][]==1则表明当前DFS的Node与Node2(j)连通,且满足Node2未被访问的条件下 则对Node2进

hihoCoder挑战赛14-1224 赛车

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

hihoCoder挑战赛11.题目4 : 高等理论计算机科学(LCA)

clj在某场hihoCoder比赛中的一道题,表示clj的数学题实在6,这道图论貌似还算可以... 题目链接:http://hihocoder.com/problemset/problem/1167 由于是中文题目,题意不再赘述. 对于任意两条小精灵的活动路径a和b,二者相交的判断条件为b的两个端点的LCA在a的路径上:那么我们可以首先将每个活动路径端点的LCA离线预处理出来,对每个节点LCA值+1. 然后以某个节点(我选择的是节点1)为根进行深搜,算出一条从节点1到节点x的LCA值和,那么任意

hihoCoder挑战赛14-1224

题目链接:赛车 解析:用down[]数组记录每个节点能向下走得最大深度,然后再枚举两个不在同一集合内的两点连接(若在同一集合,则会成环). AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int first[100005], nxt[100005], to[100005], e; int d[100