我在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()
答案 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)
现在程序启动但在输出中它说:“图形不是欧拉”。当然应该说“图有欧拉电路”。