我用Python编写了这段代码。用户编写图的邻接表,并获取图的欧拉回路、欧拉路径或非欧拉图的信息。一切都很顺利,直到最后我写了这篇文章: ln1=[1,2,1,6,2,3,3,4,4,5,5,6]输出应该是:graph有一个Euler电路。 请你更正一下密码好吗?我不知道是什么问题
# 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()
我修改了
DFSUtil
循环,并将v
更改为v+1
:现在程序启动了,但是在输出中它说:“图形不是欧拉式的”。当然应该说“图有一个欧拉回路”。在
您是否尝试过将
visited = [False] * (self.V)
替换为visited = [False] * int(self.V)
?在由于此问题不仅发生在这一行,您可能应该使用以下命令初始化类:
总之,顶点的数目应该是一个整数。在
但似乎还有很多问题。例如,在依赖于
i
的isConnected
子句后的return
语句。但是i
以前在循环中使用。因此,这应该是有效的,如果它真的只依赖于最后一个索引(在本例中似乎是可以的)。在此外,您不会保存对
visited
的更改,因为它是一个方法变量,而不是一个实例变量。因此visited
将保持设置为False
。在下一个问题:在
^{pr2}$DFSUtil
中例如,
[0, 6]
的列表从self.graph[v]
返回给v=5
。但是索引6
超出了长度为6的visited
的范围。在相关问题 更多 >
编程相关推荐