输出无向图内任意长度的环(python)

功能:统计并输出无向图内指定长度的环路

# Python Program to count
# cycles of length n
# in a given graph.

# Number of vertices
V = 5


def DFS(graph, marked, n, vert, start, count, path):
    # mark the vertex vert as visited
    marked[vert] = True

    # if the path of length (n-1) is found
    if n == 0:

        # mark vert as un-visited to make
        # it usable again.
        marked[vert] = False

        # Check if vertex vert can end with
        # vertex start
        if graph[vert][start] == 1:
            count = count + 1
            path.append(start)
            print(path)
            path.pop()

            return count
        else:
            return count

    # For searching every possible path of
    # length (n-1)
    for i in range(V):
        if marked[i] == False and graph[vert][i] == 1:
            # DFS for searching path by decreasing
            # length by 1
            path.append(i)
            count = DFS(graph, marked, n - 1, i, start, count, path)
            for node in path:
                if not marked[node] == True:
                    path.remove(node)

    # marking vert as unvisited to make it
    # usable again.
    marked[vert] = False
    return count


# Counts cycles of length
# N in an undirected
# and connected graph.
def countCycles(graph, n):
    # all vertex are marked un-visited intially.
    marked = [False] * V

    # Searching for cycle by using v-n+1 vertices
    count = 0
    for i in range(V - (n - 1)):
        path = []
        path.append(i)
        count = DFS(graph, marked, n - 1, i, i, count, path)

        # ith vertex is marked as visited and
        # will not be visited again.
        marked[i] = True

    return int(count / 2)


# main :
graph = [[0, 1, 0, 1, 0],
         [1, 0, 1, 0, 1],
         [0, 1, 0, 1, 0],
         [1, 0, 1, 0, 1],
         [0, 1, 0, 1, 0]]

n = 4
print("Total cycles of length ", n, " are ", countCycles(graph, n))

# this code is contributed by Shivani Ghughtyal

输出

[0, 1, 2, 3, 0]
[0, 1, 4, 3, 0]
[0, 3, 2, 1, 0]
[0, 3, 4, 1, 0]
[1, 2, 3, 4, 1]
[1, 4, 3, 2, 1]
Total cycles of length  4  are  3

由于相同路径会被for循环计两次,故输出的路径有重复路径,count需要除2

你可能感兴趣的:(算法)