用于查找两个节点之间的路径数的更快的算法

时间:2015-10-09 00:26:07

标签: python algorithm python-2.7 nodes graph-theory

我正在尝试用Python中的在线评判回答一个问题,但我超出了时间限制和内存限制。问题几乎是要求从起始节点到终端节点的所有路径的数量。可以看到完整的问题规范here.

这是我的代码:

pckry.on( 'layoutComplete', function( ) {
  pckry.layout();
});

代码的作用是从终端节点开始,通过探索所有相邻节点,直到顶部。我基本上做了一个广度优先的搜索算法,但它占用了太多的空间和时间。如何改进此代码以提高效率?我的方法是错误的,我该如何解决?

3 个答案:

答案 0 :(得分:2)

由于图是非循环的,因此我们可以立即看到拓扑排序为1, 2, ..., n。因此,我们可以像使用longest path problem一样使用动态编程。在列表paths中,元素paths[i]存储从1i的路径数。更新很简单 - 对于每个边(i,j),其中i来自我们的拓扑顺序paths[j] += path[i]

from collections import defaultdict

graph = defaultdict(list)
n = int(input())
while True:
    tokens = input().split()
    a, b = int(tokens[0]), int(tokens[1])
    if a == 0:
        break
    graph[a].append(b)

paths = [0] * (n+1)
paths[1] = 1
for i in range(1, n+1):
    for j in graph[i]:
        paths[j] += paths[i]
print(paths[n])

请注意,您实施的内容实际上并不是BFS,因为您没有标记您访问了哪些顶点,导致start增长不成比例。

测试图表

for i in range(1, n+1):
    dict1[i] = list(range(i-1, 0, -1))

如果您打印start的大小,您会发现给定n的最大值与binomial(n, floor(n/2))完全一致,即〜{4 ^ n / sqrt(n) 。另请注意,BFS不是您想要的,因为无法以这种方式计算路径数。

答案 1 :(得分:1)

import sys
from collections import defaultdict

def build_matrix(filename, x):
    # A[i] stores number of paths from node x to node i.

    # O(n) to build parents_of_node
    parents_of_node = defaultdict(list)
    with open(filename) as infile:
        num_nodes = int(infile.readline())
        A = [0] * (num_nodes + 1)  # A[0] is dummy variable. Not used.
        for line in infile:
            if line == "0 0":
                break

            u, v = map(int, line.strip().split())
            parents_of_node[v].append(u)

            # Initialize all direct descendants of x to 1
            if u == x:
                A[v] = 1

    # Number of paths from x to i = sum(number of paths from x to parent of i)
    for i in xrange(1, num_nodes + 1):  # O(n)
        A[i] += sum(A[p] for p in parents_of_node[i])  # O(max fan-in of graph), assuming O(1) for accessing dict.

    # Total time complexity to build A is O(n * (max_fan-in of graph))
    return A


def main():
    filename = sys.argv[1]

    x = 1  # Find number of paths from x
    y = 4  # to y

    A = build_matrix(filename, x)
    print(A[y])

答案 2 :(得分:0)

您正在做的是该代码中的DFS(而不是BFS)...

这是一个很好的解决方案的链接...... 编辑: 请改用这种方法......

http://www.geeksforgeeks.org/find-paths-given-source-destination/