使用邻接矩阵(Python或伪代码)在拓扑排序的非加权有向无环图中的最短和最长路径

时间:2014-01-24 05:46:52

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

我正在努力解决我在做作业时遇到的问题,并且真的觉得我正在过度思考这个算法,希望有人在这里推动我朝着正确的方向前进。

我将获得一个输入txt文件,如下所示:

1    // n number of graphs
4    // n number of vertices for graph 1
4    // n number of edges for graph 1
1 2  // edges given in pairs
2 3
2 4
3 4 

我应该使用这些数据来创建代表图形的n个邻接矩阵。然后我需要对邻接矩阵中的数据实现3种方法:

  1. findLongestPath()将返回图表中最长的路径
  2. findShortestPath()将返回图表中的最短路径
  3. totalNumberPaths()将返回图表中不同数量的路径
  4. 我很难实现前两部分。这就是我到目前为止所做的:

    def main():
    
    
    numGraphs = input()
    
    for x in xrange(0, numGraphs):
        numVerts = input()
        numEdges = input()
        adjMat = [[0 for x in xrange(numVerts)] for x in xrange(numVerts)] 
        for x in xrange(0, numEdges):
            edges = raw_input()
            i, padding, j = edges.rpartition(" ")
    
            i = int(i)
            j = int(j)
    
            i -= 1
            j -= 1
    
            adjMat[i][j] = 1
    
    
        numPaths = [0 for x in xrange(numVerts)]
        numPaths[0] = 1 
    
        longest_path = 1
        shortest_path = numVerts
    
        for i in xrange(0, numVerts):
            current_path = 0
            for j in xrange(0, numVerts):
                if adjMat[i][j] == 1:
                    numPaths[j] += numPaths[i]
                    current_path += 1
    
            if current_path > longest_path:
                longest_path = current_path
            if current_path < shortest_path:
                shortest_path = current_path
    
        print "shortest: %d, longest: %d, total %d" % (shortest_path, longest_path, numPaths[numVerts-1])
    
     if __name__ == "__main__":
         main()
    

    显然,当它遇到一行0时,shortest_path会更新为0并且不起作用。另外,当初始化为0时,它将无法工作。如果我可以获得一些伪代码或者可能有助于使用更长或更短的方法,我确信我可以写相反的内容,或者我可能完全偏离基础。

    感谢您的任何意见。

    编辑:

    所以我想通了。这是我完成的代码,以防任何人遇到类似问题并需要帮助。

    numGraphs = input()
    
    for x in xrange(0, numGraphs):
        numVerts = input()
        numEdges = input()
        adjMat = [[0 for x in xrange(numVerts)] for x in xrange(numVerts)] 
        for x in xrange(0, numEdges):
            edges = raw_input()
            i, padding, j = edges.rpartition(" ")
    
            i = int(i)
            j = int(j)
    
            i -= 1
            j -= 1
    
            adjMat[i][j] = 1
    
    
        numPaths = [0 for x in xrange(numVerts)]
        numPaths[0] = 1 
    
        currentPath = [0 for x in xrange(numVerts)]
        maxPath = 1
        minPath = numVerts -1
    
        for i in xrange(0, numVerts):
            for j in xrange(1, numVerts):
                if adjMat[i][j] == 1:
                    numPaths[j] += numPaths[i]
                    currentPath[j-i] += 1
                if (currentPath[j-i] is not 0):
                    minPath = currentPath[j-i]
                maxPath = max(currentPath)
    
        print "shortest: %d, longest: %d, total %d" % (minPath, maxPath, numPaths[numVerts-1])
    

1 个答案:

答案 0 :(得分:0)

想出来。这是我的最终解决方案。

numGraphs = input()

for x in xrange(0, numGraphs):
    numVerts = input()
    numEdges = input()
    adjMat = [[0 for x in xrange(numVerts)] for x in xrange(numVerts)] 
    for x in xrange(0, numEdges):
        edges = raw_input()
        i, padding, j = edges.rpartition(" ")

        i = int(i)
        j = int(j)

        i -= 1
        j -= 1

        adjMat[i][j] = 1


    numPaths = [0 for x in xrange(numVerts)]
    numPaths[0] = 1 

    currentPath = [0 for x in xrange(numVerts)]
    maxPath = 1
    minPath = numVerts -1

    for i in xrange(0, numVerts):
        for j in xrange(1, numVerts):
            if adjMat[i][j] == 1:
                numPaths[j] += numPaths[i]
                currentPath[j-i] += 1
            if (currentPath[j-i] is not 0):
                minPath = currentPath[j-i]
            maxPath = max(currentPath)

    print "shortest: %d, longest: %d, total %d" % (minPath, maxPath, numPaths[numVerts-1])