from Graph_ import Node, LinkedList, Queue
class Vertex:
def __init__(self, label):
self.label = label
class Graph:
def __init__(self):
self.adjacency_list = {}
self.edge_weights = {}
def add_vertex(self, new_vertex):
self.adjacency_list[new_vertex] = []
def add_directed_edge(self, from_vertex, to_vertex, weight = 1.0):
self.edge_weights[(from_vertex, to_vertex)] = weight
self.adjacency_list[from_vertex].append(to_vertex)
def add_undirected_edge(self, vertex_a, vertex_b, weight = 1.0):
self.add_directed_edge(vertex_a, vertex_b, weight)
self.add_directed_edge(vertex_b, vertex_a, weight)
def get_vertex(self, vertex_label):
for vertex in self.adjacency_list:
if vertex.label == vertex_label:
return vertex
return None
def total_edges(self,vertices):
#实现total_edges 获得所有边
if __name__ == '__main__':
class Node:
def __init__(self, initial_data):
self.data = initial_data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
def append(self, new_node):
if self.head == None:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
self.tail = new_node
def remove_after(self, current_node):
# Special case, remove head
if (current_node == None) and (self.head != None):
succeeding_node = self.head.next
self.head = succeeding_node
if succeeding_node == None: # Remove last item
self.tail = None
elif current_node.next != None:
succeeding_node = current_node.next.next
current_node.next = succeeding_node
if succeeding_node == None: # Remove tail
self.tail = current_node
class Queue:
def __init__(self):
self.list = LinkedList()
def enqueue(self, new_item):
# Create a new node to hold the item
new_node = Node(new_item)
# Insert as list tail (end of queue)
self.list.append(new_node)
def dequeue(self):
# Copy data from list's head node (queue's front node)
dequeued_item = self.list.head.data
# Remove list head
self.list.remove_after(None)
# Return the dequeued item
return dequeued_item
题目中好像没有说明无向边需要输出几次,如果按照代码中的存储形式的话,直接返回edge_weights里的key就可以了
def total_edges(self,vertices):
edges = []
for v in vertices:
for d in self.adjacency_list[v]:
edges.append((v, d))
return edges
会返回一个包含(起点,终点)的列表
建立边的时候把边都写在self.edge_weights里面了
感觉可以直接扫描该字典,同时对无向边进行去重,或者干脆在初始化边的时候把无向边建立为带无向label的边,即用label区分有向边与无向边。
也可以暴力遍历节点,直接用节点名拼起来去字典里扫描,复杂度会高一点
修改代码,以便接受来自用户的整数(n)作为节点数
接下来,程序应该允许用户输入 n 个字符串并从中生成一个无向图
然后,显示:'要添加边缘吗? y / n' 除非用户输入n,接受来自用户的两个字符串
接下来,找到两个具有相同 node.label 的节点,并在它们之间生成一条边
最后,编写一个函数,计算创建的无向图中的总边数
你需要在if __name__ == '__main__':
下面编写功能代码,包括输入输出,然后
可以按照输入的n个字符串调用add_vertex,我理解题目应该是n个字符串是n个节点
之后搜索相同的字符串,然后add_undirected_edge添加边