送外卖----dfs

题目链接
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>

using namespace std;
const int N = 100010;
int st[N];
bool f=false;
int a[N],b[N];
char s[N];
int n;
bool dfs(int u,int idx)
{
    if(u<1||u>n)return false;
    if(u==n)return s[idx]='\0',true;
    if(st[u])return st[u]=2,false;
    st[u]=1;
    if(dfs(u+a[u],idx+1))
    {
        s[idx]='a';
        if(st[u]==2)f=true;
        return true;
    }
    if(dfs(u+b[u],idx+1))
    {
        s[idx]='b';
        if(st[u]==2)f=true;
        return true;
    }
    return false;
}
int main()
{
    
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    if(dfs(1,0))
    {
        if(f)cout<<"Infinity!"<<endl;
        else puts(s);
    }
    else cout<<"No solution!"<<endl;
}
03-11
关于L2-043,这似乎是指PAT(Programming Ability Test)编程能力测试中的一个具体问题编号。此题名为“龙龙外卖”,是一个涉及算法和数据结构的问题。 题目背景设定在一个特殊的社区——帕特小区,这里所有的道路都是双向的并且不会形成任何闭环;换句话说,该区域的道路布局可以被视为一棵树形结构。作为外卖员的主角龙龙需要找到从根节点到达所有新增加订单位置的最短路径总长度。 解决这个问题通常涉及到以下概念和技术: - 最近公共祖先(Lowest Common Ancestor, LCA):用于处理树上两点之间的距离查询。 - 动态规划(Dynamic Programming): 可能会用来优化重复子问题的求解过程。 - 图论(Graph Theory): 因为问题本质上是在无向图上的操作。 为了计算给定新地点后的最短路径之和,一种可能的方法是利用深度优先搜索(DFS),同时记录下每个节点到其子孙节点的距离信息。当有一个新的货点加入时,可以通过已有的信息快速更新总的最短路径值而不需要重新遍历整个树状结构。 此外,由于这是一个竞赛类题目,实现效率非常重要,因此选择合适的数据结构来存储中间结果以加速查询也是解决问题的关键之一。 ### 示例代码片段展示如何构建树及寻找最近公共祖先 ```python from collections import defaultdict def dfs(node, parent): for neighbor in tree[node]: if neighbor != parent: depth[neighbor] = depth[node] + 1 parents[neighbor][0] = node dfs(neighbor, node) # 构建稀疏表 (Sparse Table) for i in range(1, logn): for j in range(1, n+1): if parents[j][i-1] != -1: parents[j][i] = parents[parents[j][i-1]][i-1] def lca(u, v): # Ensure u is not deeper than v. if depth[u] > depth[v]: u, v = v, u # Bring both nodes to the same level. for i in reversed(range(logn)): if (depth[v]-depth[u]) & (1 << i): v = parents[v][i] if u == v: return u; for i in reversed(range(logn)): if parents[u][i] != parents[v][i]: u = parents[u][i] v = parents[v][i] return parents[u][0] # 初始化设置... tree = defaultdict(list) logn = ... # 计算所需的二进制位数 n = ... # 节点数量 parents = [[-1]*logn for _ in range(n+1)] depth = [0]*(n+1) dfs(root_node, -1) # root_node 是树的根节点 ``` 这段伪代码展示了如何使用深度优先搜索初始化树的信息,并建立一个稀疏表示来支持高效的LCA查询。`lca()` 函数实现了两个节点之间最低共同祖先的查找逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值