在加权DAG中找到两个节点之间的最长路径的此函数有什么错误?

时间:2019-07-03 02:04:38

标签: python graph-algorithm directed-acyclic-graphs

我正在做一个作业,其中给了我一个顶点n,保证它是源顶点,并且在(有向无环)图中具有最小的整数标签,一个顶点m,保证了它是宿顶点,并且具有最大的整数标签,且e <= 100边u-> v:w,代表从权重w到顶点u到顶点v的有向边。我的代码预期输出两行,第一行包含DAG中顶点n和m之间最长路径的总权重,第二行包含该路径中顶点的整数标签,n-> v 0 -> v 1 -> ...-> m。如果有多个权重相同的路径,我们可以输出其中任何一条。

我的代码为问题语句给出的所有示例测试用例,调试时创建的少量额外测试用例以及除我的代码以外的所有私有测试用例中的所有私有测试用例输出正确答案。我必须提交的在线平地机。评分器不会提供检查您的代码所依据的测试输入,它只会为您提供二进制通过或失败,以及您的代码给出了错误答案的测试用例。

我的代码仅在在线评分器的8个私人测试用例中的最后一个失败,但是由于评分器没有提供实际的输入,因此我很难确定问题出在哪里。我的原始代码有一个问题,导致它返回DAG中从任何顶点开始并在接收器处结束的最长路径,而不一定返回从所需源顶点开始的最长路径,但此后我写了一个几个测试用例并解决了该问题(除非我遗漏了一些东西),这似乎并不是我的代码失败的原因。较新的实现在最终测试中仍然失败。从那以后,我一直无法自行提出任何失败案例。我的代码如下:

import math
import re
import sys


class Node:
    def __init__(self):
        self.incoming_edges = []
        self.path = []
        self.weight = -math.inf

def find_longest_path(source, own):
    for edge in graph[own].incoming_edges:
        find_longest_path(source, edge[0])

    if len(graph[own].incoming_edges) > 0:
        heaviest_edge = None
        edge_weight = -math.inf

        for edge in graph[own].incoming_edges:
            if graph[edge[0]].weight + edge[1] > edge_weight:
                edge_weight = graph[edge[0]].weight + edge[1]
                heaviest_edge = edge[0]

        if heaviest_edge != None:
            graph[own].weight = edge_weight
            graph[own].path = graph[heaviest_edge].path + [own]

    elif own == source:
        graph[own].weight = 0
        graph[own].path = [own]


if __name__ == "__main__":
    source = int(sys.stdin.readline().strip())
    sink = int(sys.stdin.readline().strip())
    graph = [Node() for _ in range(sink + 1)]
    for edge in [list(map(int, re.split('->|:', line.strip()))) for line in sys.stdin]:
        graph[edge[1]].incoming_edges.append((edge[0], edge[2]))
    find_longest_path(source, sink)
    print(graph[sink].weight if graph[sink].weight >= 0 else '')
    print('->'.join(list(map(str, graph[sink].path))))

如果有人可以指出问题出在哪里,或者至少提供返回错误答案的测试输入,将不胜感激。

此外,我知道我的代码可能会不必要地重新计算一堆东西。在我的原始实现中有一个检查,该检查是我在较早调试时删除的,一旦可以使用,我将把类似的东西放回去。

0 个答案:

没有答案
相关问题