修理道路拼图解释

时间:2018-03-10 10:29:54

标签: python depth-first-search

我正在从HackerRank开始研究这个难题,"修复道路"

  

Byteland的国家/地区包含城市和双向道路。   任何两个城市之间都有一条路。 Byteland的道路是   很久以前建造的,现在他们需要修理。你去过   雇用来修理所有的道路。您打算通过调度来完成此操作   一些道路上的机器人。每个机器人都会修复他的道路   目前正在运行,然后移动到相邻的未修复道路之一。   在修复之后,它将移动到另一个相邻的未修复的   道路,修理等等。

     

如果两条道路在其中一条道路上有相同的城市,则它们相邻   端点。为了使过程高效,永远不会有两个机器人   修理同一条路,没有路可以访问两次。是什么   完成任务所需的最少机器人数量?

     

输入格式

     

第一行包含测试用例的数量T.T测试用例如下。   每个测试用例的第一行包含N,即城市中的城市数量   Byteland。城市编号为0..N-1。以下N-1行包含   道路的描述。第i行包含两个整数a和b,   意味着有一条连接城市的道路与数字ai和bi。

从概念上讲,解决这个问题的方法是通过深度优先搜索,但我对如何使用DFS来解决这个问题有疑问。我尝试了几种方法,无法让它发挥作用。

如果我们将输入数据建模为图形并执行DFS,我们将按预期获得深度优先遍历路径。然后我们可以阻止搜索向后移动,并从剩余的顶点(使用访问标记或删除顶点)中找到不同路径的数量。但这并没有给出最佳解决方案,即机器人数量最少,因为当节点有多个顶点时我无法控制选择。

我找到了一些解决方案,他们将其建模为树,并使用某种递归来跟踪到达叶节点时遍历的层数,因为递归堆栈返回到节点。使用它,他们通过lvl / 2跟踪机器人的数量。我不确定这是否符合某些算法,但我不知道如何使用它来解决问题。

def dfs(n):
    visited[n] = True
    r, l1, l2 = 0, 0, 0
    for adj in G[n]:
        if visited[adj]: continue
        r1, l = dfs(adj)
        r += r1
        if l == 1: l1 += 1
        if l == 2: l2 += 1
    if l2 == 0:
        if l1 == 0:
            return r, 1
        else:
            return r, 2
    else:
        if l2 % 2 == 0:
            return r + l2//2, 0
        else:
            return r + l2//2, 2}

1 个答案:

答案 0 :(得分:0)

最小机器人数意味着每个机器人的最长路径。
为了找到最长的路径,我建议如下:
1.从N个节点(城市)中的每个节点找到最长的路径。 (通过存储所有路径可以找到每条路径的最长路径:请参阅here
找到的N的最长路径是一个机器人的路径 3.删除该最长路径的边缘(道路),以便它不会包含在以下搜索中 4.重复1-3,直到删除所有边缘