📜  在 Graph 的 Adjacency List 表示中添加和删除顶点

📅  最后修改于: 2021-10-25 03:10:00             🧑  作者: Mango

先决条件:链表、图数据结构

在本文中,在给定的邻接表表示中讨论了添加和删除顶点。

让有向图为:

该图可以在邻接表表示中表示为:

它是一种链表表示,其中链表的头部是图中的一个顶点,所有连接的节点都是第一个顶点所连接的顶点。例如,从图中可以清楚的是顶点0连接到顶点4,31。同样在邻接表(或链表)表示中表示。

方法:

    这个想法是将图表示为一个链表列表,其中链表的头部是顶点,所有连接的链表都是它所连接的顶点。
  • 在图中添加一个顶点:要在图中添加一个顶点,可以将邻接表迭代到需要插入的地方,并可以使用链表实现创建新节点。例如,如果需要在顶点 2 和顶点 3 之间添加 5,使得顶点 3 指向顶点 5,顶点 5 指向顶点 2,则在顶点 5 和顶点 3 之间创建一条新边,并从顶点 5 和顶点 2。 添加顶点后,邻接表变为:
  • 删除图中的顶点:要删除图中的顶点,请遍历每个顶点的列表(如果边存在或不存在)。如果边存在,则以与在链表中执行删除相同的方式删除顶点。例如,如果从列表中删除顶点 4,邻接列表将转换为以下列表:

    下面是上述方法的实现:

    # Python implementation of the above approach
    # Implementing Linked List representation
    class AdjNode(object):
        def __init__(self, data):
            self.vertex = data
            self.next = None
      
    # Adjacency List representation
    class AdjList(object):
      
        def __init__(self, vertices):
            self.v = vertices
            self.graph =[None]*self.v
      
    # Function to add an edge from a source vertex 
    # to a destination vertex
        def addedge(self, source, destination):
            node = AdjNode(destination)
            node.next = self.graph
            self.graph= node
      
    # Function to call the above function.
        def addvertex(self, vk, source, destination):
            graph.addedge(source, vk) 
            graph.addedge(vk, destination)
      
    # Function to print the graph
        def print_graph(self):
            for i in range(self.v):
                print(i, end ="")
                temp = self.graph[i]
                while temp:
                   print("->", temp.vertex, end ="")
                   temp = temp.next
                print("\n")
      
    # Function to delete a vertex
        def delvertex(self, k):
      
    # Iterating through all the vertices of the graph
            for i in range(self.v):
                temp = self.graph[i]
                if i == k:
                    while temp:
                        self.graph[i]= temp.next
                        temp = self.graph[i]
                          
                # Delete the vertex 
                # using linked list concept        
                if temp:
                    if temp.vertex == k:
                        self.graph[i]= temp.next
                        temp = None
                while temp:
                    if temp.vertex == k:
                        break
                    prev = temp
                    temp = temp.next
      
                if temp == None:
                    continue
      
                prev.next = temp.next
                temp = None
          
      
    # Driver code
    if __name__ == "__main__":
      
        V = 6
        graph = AdjList(V) 
        graph.addedge(0, 1)
        graph.addedge(0, 3)
        graph.addedge(0, 4)
        graph.addedge(1, 2)
        graph.addedge(3, 2)
        graph.addedge(4, 3)
      
    print("Initial adjacency list")
    graph.print_graph() 
      
    # Add vertex
    graph.addvertex(5, 3, 2)
    print("Adjacency list after adding vertex")
    graph.print_graph() 
      
    # Delete vertex
    graph.delvertex(4)
    print("Adjacency list after deleting vertex")
    graph.print_graph()
    
    输出:
    Initial adjacency list
    0-> 4-> 3-> 1
    
    1-> 2
    
    2
    
    3-> 2
    
    4-> 3
    
    5
    
    Adjacency list after adding vertex
    0-> 4-> 3-> 1
    
    1-> 2
    
    2
    
    3-> 5-> 2
    
    4-> 3
    
    5-> 2
    
    Adjacency list after deleting vertex
    0-> 3-> 1
    
    1-> 2
    
    2
    
    3-> 5-> 2
    
    4
    
    5-> 2
    

    如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。