from graph import Vertex, Graph
# Depth-first search function
def depth_first_search(graph, start_vertex, visit_function):
vertex_stack = [start_vertex]
visited_set = set()
while len(vertex_stack) > 0:
current_vertex = vertex_stack.pop()
if current_vertex not in visited_set:
visit_function(current_vertex)
visited_set.add(current_vertex)
for adjacent_vertex in graph.adjacency_list[current_vertex]:
vertex_stack.append(adjacent_vertex)
# Main program - Creates 3 different graphs, each with vertices A through F, but with
# different sets of edges. Traverses each with DFS.
vertex_names = ["A", "B", "C", "D", "E", "F"]
# Add the same set of vertices to 3 different graphs
graph1 = Graph()
graph2 = Graph()
graph3 = Graph()
graphs = [graph1, graph2, graph3]
for vertex_name in vertex_names:
for graph in graphs:
graph.add_vertex(Vertex(vertex_name))
# Add graph 1's edges
graph1.add_undirected_edge(graph1.get_vertex("A"), graph1.get_vertex("B"))
graph1.add_undirected_edge(graph1.get_vertex("A"), graph1.get_vertex("D"))
graph1.add_undirected_edge(graph1.get_vertex("B"), graph1.get_vertex("E"))
graph1.add_undirected_edge(graph1.get_vertex("B"), graph1.get_vertex("F"))
graph1.add_undirected_edge(graph1.get_vertex("C"), graph1.get_vertex("F"))
graph1.add_undirected_edge(graph1.get_vertex("E"), graph1.get_vertex("F"))
# Add graph 2's edges
graph2.add_undirected_edge(graph2.get_vertex("A"), graph2.get_vertex("B"))
graph2.add_undirected_edge(graph2.get_vertex("B"), graph2.get_vertex("C"))
graph2.add_undirected_edge(graph2.get_vertex("C"), graph2.get_vertex("F"))
graph2.add_undirected_edge(graph2.get_vertex("D"), graph2.get_vertex("E"))
graph2.add_undirected_edge(graph2.get_vertex("E"), graph2.get_vertex("F"))
# Add graph 3's edges
graph3.add_undirected_edge(graph3.get_vertex("A"), graph3.get_vertex("B"))
graph3.add_undirected_edge(graph3.get_vertex("A"), graph3.get_vertex("E"))
graph3.add_undirected_edge(graph3.get_vertex("B"), graph3.get_vertex("C"))
graph3.add_undirected_edge(graph3.get_vertex("B"), graph3.get_vertex("E"))
graph3.add_undirected_edge(graph3.get_vertex("C"), graph3.get_vertex("E"))
graph3.add_undirected_edge(graph3.get_vertex("D"), graph3.get_vertex("E"))
graph3.add_undirected_edge(graph3.get_vertex("E"), graph3.get_vertex("F"))
# Create a visitor function that displays a vertex's label
visitor = lambda x: print(x.label, end=' ')
# Choose a starting vertex
start_vertex_label = "A"
# Visit vertices in each graph with DFS
print('Depth-first search traversal')
for i in range(0, len(graphs)):
print('Graph ' + str(i + 1) + ': ', end='')
depth_first_search(graphs[i], graphs[i].get_vertex(start_vertex_label), visitor)
print()
class Vertex:
# Constructor for a new Vertex object
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)
# Returns the vertex in this graph with the specified label, or None
# if no such vertex exists.
def get_vertex(self, vertex_label):
for vertex in self.adjacency_list:
if vertex.label == vertex_label:
return vertex
return None
题目
from Graph_ import Node, LinkedList, Queue
class Vertex:
def __init__(self, label):
self.label = label
# class for creation of graphs
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 depth_first_search(graph, start_vertex,end_vertex):
# *** Modify the bellow code **
vertex_stack = [start_vertex]
visited_set = set()
while len(vertex_stack) > 0:
current_vertex = vertex_stack.pop()
if current_vertex not in visited_set:
print(current_vertex.label, end=' ')
visited_set.add(current_vertex)
for adjacent_vertex in graph.adjacency_list[current_vertex]:
vertex_stack.append(adjacent_vertex)
return dist
if __name__ == '__main__':
A = Vertex("A")
B = Vertex("B")
C = Vertex("C")
D = Vertex("D")
E = Vertex("E")
F = Vertex("F")
vertex_names = [A,B,C,D,E,F]
# Add the same set of vertices to 3 different graphs
graph1 = Graph()
graph2 = Graph()
graph3 = Graph()
graphs = [graph1, graph2, graph3]
for vertex_name in vertex_names:
for graph in graphs:
graph.add_vertex(vertex_name)
# Add graph 1's edges
graph1.add_undirected_edge(A, B)
graph1.add_undirected_edge(A, D)
graph1.add_undirected_edge(B, E)
graph1.add_undirected_edge(B, F)
graph1.add_undirected_edge(C, F)
graph1.add_undirected_edge(E, F)
# Add graph 2's edges
graph2.add_undirected_edge(A, B)
graph2.add_undirected_edge(B, C)
graph2.add_undirected_edge(C, F)
graph2.add_undirected_edge(D, E)
graph2.add_undirected_edge(E, F)
# Add graph 3's edges
graph3.add_undirected_edge(A, B)
graph3.add_undirected_edge(A, E)
graph3.add_undirected_edge(B, C)
graph3.add_undirected_edge(B, E)
graph3.add_undirected_edge(C, E)
graph3.add_undirected_edge(D, E)
graph3.add_undirected_edge(E, F)
# ** Your code goes here **