ADT graph depth-first-search的入门案例

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 **

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kangabo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值