题解 | #送快递#

送快递

先找到最长的路径,得到路径的长度depth。那么剩下的节点还能访问的数量则要根据剩余电量来判断。

想要求出快递员最多可以送多少个用户,则需要规划出一条路径做到用最少的电量访问更多的用户。可以抽象理解为,用最短的路径访问图中最多的节点。

那么,思考一个简化的问题:

(1)从当前节点0开始做深度优先遍历,找到最长的路径称为主干path,长度为depth。从0出发,沿着path依次遍历。

(2)每次遇到一个分支就进入访问该分支的节点,访问完成后原路返回到主干path。这个过程走过的路径长度为2d,d为分支上的节点数。

(3)返回主干path后,继续向下遍历。遇到分支就回到第二步。

当走完所有节点后,对于主干path上的路径我们只走了一遍,所有分支上的路径都走了两遍。因此,遍历所有节点的最短路径为:depth+2D,depth为最长的路径主干path的长度,D为分支路径的长度。

回到送快递问题,快递员在0号位置出发,首先需要找到最长的路径path,长度为depth,然后判断剩余电量K是否大于depth。

若k<=depth,则返回1+k。这种情况沿着最长路径送快递就行。

若k>depth,则返回1+depth+(k-depth)//2。这种情况不仅需要沿着最长路径送快递,且遇到分支也需要送快递。(k-depth)为在保证快递员送完主干路径上的用户后还剩余的电量,这些电量用来为分支路径上的用户送快递。因为,送完分支上的用户还需返回,因此能送的分支用户数计算为(k-depth)//2。

def dfs(maps,cur, visited,path,max_depth):
    if len(path) > max_depth[0]:
        max_depth[0]=len(path)
    for neibor in maps[cur]:
        if visited[neibor]:
            pass
        else:
            visited[neibor] = True
            path.append(neibor)
            dfs(maps,neibor, visited,path,max_depth)
            path.pop()
            visited[neibor] = False



if __name__ == "__main__":
    line1 = list(map(int, input().split()))
    n, k = line1[0], line1[1]
    S = list(map(int, input().split()))  # S
    # 邻接表
    maps = [[] for i in range(n)]
    for i in range(n - 1):
        # (i+1)  <----------> S[i]
        if S[i] in maps[i + 1]:
            pass
        else:
            maps[i + 1].append(S[i])
        if (i + 1) in maps[S[i]]:
            pass
        else:
            maps[S[i]].append(i + 1)

    # print(maps)
    visited = [False]*n
    visited[0]=True# 0节点已经访问
    path = [0]
    max_depth = [1]
    # print(distance[0])
    dfs(maps,0, visited,path,max_depth)
    max_depth = max_depth[0]-1
    # print(path)
    if k <=max_depth:
        print(k+1)
    else:
        print(min(n,max_depth +1+ (k-max_depth)//2))

全部评论

相关推荐

头像
04-07 11:33
C++
点赞 评论 收藏
转发
AJAX(Asynchronous&nbsp;JavaScript&nbsp;and&nbsp;XML)是一种在异步编程中常用的技术,它允许通过&nbsp;JavaScript&nbsp;在后台与服务器进行数据交换而无需刷新整个页面。使用AJAX,可以通过异步方式向服务器发送请求,并处理服务器返回的数据,而不会中断用户当前的操作或刷新整个页面。这使得网页能够实现更加流畅的用户体验和动态内容的更新。以下是&nbsp;AJAX&nbsp;在异步编程中的应用的一般步骤:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=aa2d7fa706914dfc9afef6476efb3004创建&nbsp;XMLHttpRequest&nbsp;对象:通过&nbsp;JavaScript&nbsp;创建一个&nbsp;XMLHttpRequest&nbsp;对象,用于与服务器进行数据交换。指定回调函数:定义在服务器响应后要执行的回调函数。这个回调函数将负责处理从服务器返回的数据。配置&nbsp;XMLHttpRequest&nbsp;对象:使用&nbsp;XMLHttpRequest&nbsp;对象的方法和属性来配置请求。这包括指定请求的类型(GET、POST&nbsp;等)、URL、是否异步等。发送请求:调用&nbsp;XMLHttpRequest&nbsp;对象的&nbsp;open()&nbsp;方法和&nbsp;send()&nbsp;方法来发送请求到服务器。处理响应:在指定的回调函数中处理服务器的响应。可以通过&nbsp;XMLHttpRequest&nbsp;对象的属性如&nbsp;status&nbsp;和&nbsp;responseText&nbsp;来获取服务器返回的数据。更新页面:根据服务器响应的数据,使用&nbsp;JavaScript&nbsp;修改网页的内容或执行其他操作,以实现动态更新。https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=aa2d7fa706914dfc9afef6476efb3004
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务