zoukankan      html  css  js  c++  java
  • 题解 洛谷P2959 【[USACO09OCT]悠闲漫步The Leisurely Stroll】

    原题:洛谷P2959

    不得不说这道题的图有点吓人,但实际上很多都没有用

    通过题上说的“三岔路口”(对于每一个节点有三条连接,其中一条连接父节点,另外两条连接子节点)和数据,可以那些乱七八糟的路和牧场看成是一棵二叉树,又因为 “对任意一个节点来说,只有一条从节点1开始的路径可以到达” ,所以可以把1作为根节点。从而将题目转化为求一棵以1为节点的二叉树的深度

    核心算法:DFS

    注意:

    1.根节点的深度在此题中应该为1(节点1的实际意义是一个要算入答案的一个牧场)

    2.有n个节点,他们之间的连接数应该为n-1

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<cmath>
    typedef long long ll;
    using namespace std;
    struct Node{
        int id,l,r;
        Node(){
            l=r=0;
        }
    }tr[1010];//保存二叉树
    int p,dep[1010],ans=0;//个数,节点深度,答案(树的深度)
    void addedge(int i,int r,int l){
        tr[i].id=i;
        tr[i].l=l;
        tr[i].r=r;
    }//编号为i的接点的左节点l,右节点r
    void Init() {
        scanf("%d",&p);
        int a,b,c;
        for(int i=1;i<p;i++){
            scanf("%d%d%d",&a,&b,&c);
            addedge(a,b,c);
        }
        dep[1]=1;//注意初始化
    }
    void DFS(int i){
        if(tr[i].l){//如果左节点不为0
            dep[tr[i].l]=dep[i]+1;//左节点的深度
            ans=max(ans,dep[i]+1);//更新树的深度
            DFS(tr[i].l);//接着左节点向下找
        }
        if(tr[i].r){//同理
            dep[tr[i].r]=dep[i]+1;
            ans=max(ans,dep[i]+1);
            DFS(tr[i].r);
        }
    }
    int main() {
        Init();
        DFS(1);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    elasticsearch 数据迁移
    elasticsearch使用简介 -安装篇
    docker 使用笔记
    PHP 全局变量
    做人做事需牢记20条原则
    MYSQL 存储引擎概述
    postgresql常用命令
    ORACLE 清理SYSAUX表空间
    sqlserver数据库的启动
    postgressql启动与关闭
  • 原文地址:https://www.cnblogs.com/lazy-people/p/9308505.html
Copyright © 2011-2022 走看看