Shortest and longest path in a topologically sorted unweighted directed acyclic graph using an adjacency matrix (Python, or pseudo-code)

StackOverflow https://stackoverflow.com/questions/21325333

Question

I'm trying to solve a problem I was given for homework and really feel like I'm overthinking the algorithm and hoping someone here can push me in the right direction.

I'm going to be given an input txt file which will look like this :

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 

And I'm supposed to use this data to crate n number of adjacency matrices representing the graphs. I then need to implement 3 methods on the data in the adjacency matrices:

  1. findLongestPath() which will return the longest path in the graph
  2. findShortestPath() which will return the shortest path in the graph
  3. totalNumberPaths() which will return distinct number of paths in graph

I'm having difficulty implementing the first two parts fine. This is what I have so far:

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()

Obviously when it hits a row of 0s the shortest_path updates to 0 and doesn't work. Plus it won't work when initialized to a 0. If I could get some pseudo code or maybe help with the longer or shorter method I'm sure I could write the opposite or maybe I'm totally off base.

Thanks for any input.

Edit:

So i figured it out. Here's my finished code in case anyone has a similar problem and needs help.

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])
Was it helpful?

Solution

Figured it out. Here is my final solution.

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])
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top