我赶紧写了这个班级'它采用(用于初始化)图形的文本表示(作为字符串)并构造图形对象。
第一行(标题)描述了图形的类型和顶点的数量。它有两个或三个部分。第一部分是表示有向图的字符D,或表示无向图的字符U.
如果图表是加权的,则标题的第二部分是字符W.
标题的最后一部分是一个自然数n,表示图中的顶点数。图中的所有顶点都编号为0到n-1。
如果图表字符串有多行,则每个剩余行(从第二行开始)描述一条边。边的前两个部分是0和n-1之间的两个自然数,描述了用这些数字标识的两个顶点之间的边。
如果指向图形,则必须将这两个数字解释为描述从第一个顶点到第二个顶点的边的有序对。如果图是无向的,则必须将这两个数字解释为描述两个顶点之间的边的无序对。
如果图表是加权的,那么第三部分将是一个表示边缘权重的整数。
图表既可以是定向的,也可以是非定向的,加权的或非加权的 例如,此图表:
graph_string = """\
D W 3
0 1 7
1 0 -2
0 2 0
"""
print(Graph(graph_string).adjacency_list)
是指导和加权的,' 3'这些旁边的符号表示边数(在本例中为3)。 此示例的adjacency_list将输出:
[[(1, 7), (2, 0)], [(0, -2)], []]
'班级'我写过的确实能做到这一点,但不是一个班级应该采取行动的方式。我对如何把它变成一个合适的类感到困惑,我现在所知道的只是它应该只有:
class Graph:
def __init__(self, graph_string):
self.directed = # true if directed, false if un-directed
self.weighted = # true if weighted, false otherwise
self.adjacency_list = # a list of lists
作为init,用单独的方法/函数来实现其余的。 感谢您花时间阅读本文,并且随时可以提问,因为这很难说。 我的班级:
class Graph:
def __init__(self, graph_string):
self.graph_string = []
graph_string = graph_string.splitlines()
for i in graph_string:
i = (i.split())
self.graph_string.append(i)
directed_helper = self.graph_string[0]
directed_score = directed_helper[0]
weighted_helper = self.graph_string[0]
weighted_score = weighted_helper[1]
self.weighted = weighted_score
self.directed = directed_score
self.graph_string.pop(0)
if self.directed == ("D"):
self.directed = True
elif self.directed == ("U"):
self.directed = False
if self.weighted == ("W"):
self.weighted = True
elif self.weighted != ("W"):
self.weighted = False
if self.weighted == False:
edge_number = graph_string[0]
edge_number = list(edge_number)
edge_number = edge_number[2]
edge_number = int(edge_number)
self.adjacency_list = [[] for _ in range(edge_number)]
elif self.weighted == True:
edge_number = graph_string[0]
edge_number = list(edge_number)
edge_number = edge_number[4]
edge_number = int(edge_number)
self.adjacency_list = [[] for _ in range(edge_number)]
if self.weighted == False:
if self.directed == True:
for s in self.graph_string:
first_element = s[0]
first_element = int(first_element)
second_element = s[1]
second_element = int(second_element)
self.adjacency_list[first_element].append((second_element, None))
elif self.directed == False:
for t in self.graph_string:
first_element = t[0]
first_element = int(first_element)
second_element = t[1]
second_element = int(second_element)
self.adjacency_list[first_element].append((second_element, None))
self.adjacency_list[second_element].append((first_element, None))
elif self.weighted == True:
if self.directed == True:
for t in self.graph_string:
first_element = t[0]
first_element = int(first_element)
second_element = t[1]
second_element = int(second_element)
third_element = t[2]
third_element = int(third_element)
self.adjacency_list[first_element].append((second_element, third_element))
if self.directed == False:
for t in self.graph_string:
first_element = t[0]
first_element = int(first_element)
second_element = t[1]
second_element = int(second_element)
third_element = t[2]
third_element = int(third_element)
self.adjacency_list[first_element].append((second_element, third_element))
self.adjacency_list[first_element].append((first_element, third_element))
(self.adjacency_list)
此类确实给出了正确的答案,但是在添加新函数/方法时,类无法正确读取它们。我们还建议只在 init 方法中使用变量self和graph_string。
答案 0 :(得分:0)
这是一个很难回答的问题,因为它是主观的。
但我的第一个建议是尝试:
将代码拆分为较小的子单元IE:
如果您多次编写相同的代码,则需要将其与方法
分开希望有所帮助