Nowcoder girl 2019:第二题 吃桃

吃桃

https://ac.nowcoder.com/acm/contest/3405/B

题目链接🔗:吃桃

题意简述

这题要在有 个点的连通图中,以点 为起点,找到一条深度最深(长度最长)的路径,并且把路径记录下来。

解题思路

一共分为两步:

  1. DP+DFS 找到每个点的所有子节点的最长深度,记录在 中, 为父节点的编号。

  2. 贪心递归 每次都选能走到最长深度的那个子节点。

注意点

-这个是无向图,如果a,b之间有边,要互存为父节点和子节点。为了防止遍历的时候走回来,记得开个 记录已经走过的点。【这题的OJ数据很弱,没有环。之前比赛时的代码没有记录每个节点是否走过,只在遍历的时候跳过父节点,也可以AK。但是在有环的情况下会死循环(吃掉的桃子又重新长出来了hhh,根据题意其实数据可以带环的,反正走过一遍之后桃子就被吃掉了,就得走别的有桃子的路径,没桃子就 路径结束)】

-图用数组模拟的链表存或者vector二维数组存都可以,都挺好写的,没啥区别(>-<定义变量的时候看起来整齐一点,我就用vector了)

代码

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;

bool st[N];//用来存这个节点有没有被走过
vector<int> a[N];//开一个二维数组来保存节点之间的连接
vector<int> w[N];//储存每个点出发的多种方案吃到的桃子数
vector<int> ans;//保存经过的节点

int dfs(int t) {
    st[t]=true;
    int mx = 0;
    for (auto it : a[t]) {//对于所有和t相接的点都继续遍历,得到它的深度
        if (st[it] == true) {//跳过走过的点
            w[t].push_back(-1);
            continue;
        }
        int v = dfs(it);
        st[it]=false;
        w[t].push_back(v);//把每个子节点的最大深度存下来
        mx = max(mx, v);//选取最大的作为这个节点的深度备选
    }
    return mx + 1;//这个就是该点的深度了
}



void getans(int t) {
    ans.push_back(t);//先把选到的点t存到路径里
    st[t]=true;
    int mxid = -1, mxval = -1;//用来记录下游节点里路径最长的点的编号和长度
    for (int i = 0; i < a[t].size(); ++i) {//对于点t的每个下游节点,找到一个深度最大的点
        int it = a[t][i];
        if (st[it] == true) continue;//如果是走过的点就跳过
        if (w[t][i] > mxval) {
            mxid = it;     
            mxval = w[t][i];
        }
    }
    if (mxid == -1) return;//没有下游节点的时候,我们就找完啦~
    getans(mxid);//有下游节点时继续找下游节点的最长路径
    st[mxid]=false;
}

int main()
{
    int n, k;//节点数n,和起点k
    int ta, tb;
    cin >> n >> k;
    for (int i = 0; i < n - 1; ++i) {
        cin >> ta >> tb;
        a[ta].push_back(tb);//用a[i][?]来保存与第i个节点相邻的所有节点编号
        a[tb].push_back(ta);//因为是无向图,双方互通
    }
    dfs(k);//每个点的所有子节点的最长深度
    getans(k);//得到最长路径的点编号,存在ans内

    //依次输出ans容器中保存的路径
    for (auto it : ans) cout << it << endl;
    return 0;
}
全部评论
我按照这个代码改成了python3,可是通过率只有40%...不知道哪儿有问题嘞,代码贴在本题的讨论区里了,要是能帮忙看看就好啦,谢谢!
点赞 回复 分享
发布于 2019-12-12 09:41

相关推荐

不愿透露姓名的神秘牛友
07-09 12:02
ssob上原来真有BOSS啊
硫蛋蛋:这种也是打工的,只不是是给写字楼房东打工
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务