Python:euler电路和euler路径

时间:2018-05-11 13:29:44

标签: python graph path euler-angles circuit

我在Python中使用了这段代码。如果图形具有欧拉电路,欧拉路径或不是欧拉,则用户编写图形的附属列表并获取信息。一切都运转正常,直到我最后写到: ln1 = [1,2,1,6,2,3,3,4,4,5,5,6]输出应为:图形具有欧拉电路。 你能纠正这个代码吗?我不知道问题是什么

# Python program to check if a given graph is Eulerian or not
# Complexity : O(V+E)

from collections import defaultdict


# This class represents a undirected graph using adjacency list 
representation
class Graph:

    def __init__(self, vertices):
        self.V = vertices  # No. of vertices
        self.graph = defaultdict(list)  # default dictionary to store graph

    # function to add an edge to graph
    def addEdge(self, u, v):
        self.graph[u].append(v)
        self.graph[v].append(u)

    # A function used by isConnected
    def DFSUtil(self, v, visited):
        # Mark the current node as visited
        visited[v] = True

        # Recur for all the vertices adjacent to this vertex
        for i in self.graph[v]:
            if visited[i] == False:
                self.DFSUtil(i, visited)

    '''Method to check if all non-zero degree vertices are
    connected. It mainly does DFS traversal starting from 
    node with non-zero degree'''

    def isConnected(self):

        # Mark all the vertices as not visited
        visited = [False] * (self.V)

        #  Find a vertex with non-zero degree
        for i in range(self.V):
            if len(self.graph[i]) > 1:
                break

        # If there are no edges in the graph, return true
        if i == self.V - 1:
            return True

        # Start DFS traversal from a vertex with non-zero degree
        self.DFSUtil(i, visited)

        # Check if all non-zero degree vertices are visited
        for i in range(self.V):
            if visited[i] == False and len(self.graph[i]) > 0:
                return False

        return True

    '''The function returns one of the following values
       0 --> If grpah is not Eulerian
       1 --> If graph has an Euler path (Semi-Eulerian)
       2 --> If graph has an Euler Circuit (Eulerian)  '''

    def isEulerian(self):
        # Check if all non-zero degree vertices are connected
        if self.isConnected() == False:
            return 0
        else:
            # Count vertices with odd degree
            odd = 0
            for i in range(self.V):
                if len(self.graph[i]) % 2 != 0:
                    odd += 1

            '''If odd count is 2, then semi-eulerian.
            If odd count is 0, then eulerian
            If count is more than 2, then graph is not Eulerian
            Note that odd count can never be 1 for undirected graph'''
            if odd == 0:
                return 2
            elif odd == 2:
                return 1
            elif odd > 2:
                return 0

    # Function to run test cases
    def test(self):
        res = self.isEulerian()
        if res == 0:
            print "graph is not Eulerian"
        elif res == 1:
            print "graph has a Euler path"
        else:
            print "graph has a Euler cycle"





ln1 = [1, 2, 1, 6, 2, 3, 3, 4, 4, 5, 5, 6]
#ln1 = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 1, 2, 1, 4, 1, 5, 2, 3, 2, 4, 3, 5, 4, 5] #euler path
#ln1 = [1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 2, 3, 2, 5, 2, 6, 3, 4, 3, 5, 4, 6, 5, 6] #euler path
g1 = Graph(len(ln1)/2)
i = 0
j = 1
while i + 2 <= len(ln1) and j + 1 <= len(ln1):
    g1.addEdge(ln1[i], ln1[j])
    i += 2
    j += 2
g1.test()

2 个答案:

答案 0 :(得分:0)

您是否尝试将visited = [False] * (self.V)替换为visited = [False] * int(self.V)

由于此问题不仅发生在此行,您应该使用以下命令启动您的类:

self.V = int(vertices)  # No. of vertices

Imho无论如何顶点的数量应该是整数。

但似乎还有更多问题。例如,在return子句之后,isConnected语句中有一个if语句,该语句取决于i。但是之前在循环中使用了i。所以这应该只有效,如果它真的只取决于最后一个索引(在这种情况下似乎没问题)。

此外,您不会将更改保存到visited,因为它是方法变量但不是实例变量。因此visited将保持设置为False

下一个问题:在DFSUtil

# Recur for all the vertices adjacent to this vertex
for i in self.graph[v]:
    if visited[i] == False:
        self.DFSUtil(i, visited)

[0, 6] self.graph[v]返回v=5的{​​{1}}列表。但索引6超出visited的范围,长度为6。

答案 1 :(得分:0)

我修改了DFSUtil循环并将v更改为v+1

for i in self.graph[v+1]:
      if visited[i] == False:
      self.DFSUtil(i, visited)

现在程序启动但在输出中它说:“图形不是欧拉”。当然应该说“图有欧拉电路”。