Adjacency List and Adjacency Matrix in Python

前端 未结 3 2016
感动是毒
感动是毒 2020-12-02 21:31

Hello I understand the concepts of adjacency list and matrix but I am confused as to how to implement them in Python:

An algorithm to achieve the following two examp

相关标签:
3条回答
  • 2020-12-02 22:04

    I hope the below example helps you it has both Initialized Graph as well as user customized

    class Graph:
    """
      Read the Intialized Graph and Create a Adjacency list out of it 
       There could be cases where in the initialized graph <map> link
      issues are not maintained
       for example node 2 to 1 link 
        2->1
       there needs to be a link then since undirected Graph
        1->2
    """
    
    def __init__(self,Graph_init):
        self.edge={}
        for keys,values in Graph_init.items():
             for value in values:
                 self.addEdge(keys,value);
    
    """
    Add a vertex to graph map
    structure is
    int => int list
    """
    def addVertex(self,v):
        if v not in self.edge:
            self.edge[v]=[]
    """
    Add Edge from both vertex to each other
    Make sure the nodes are present   
    

    """
    def addEdge(self,u,v): if u not in self.edge: self.addVertex(u) if v not in self.edge: self.addVertex(v) if u not in self.edge[v]: self.edge[v].append(u) if v not in self.edge[u]: self.edge[u].append(v)

    def isEdge(self,u,v):
        if u not in self.edge:
            return False
        if v not in self.edge:
            return False 
        return  u in self.edge[v] 
    
    def display(self):
        for keys,values in self.edge.items():
            print(keys,":=>",values)
    
    """A initalized Graph (not in form of adjaceny list"""
    Graph_init = {1:[2,3,5],
              2:[1,4],
              3:[1,6]};
    
    """Default constrcutor takes care of making the initialzed map to adjaceny 
    list"""                 
    g=Graph(Graph_init)
    g.addVertex(1)
    g.addVertex(2) 
    g.addVertex(3)
    g.addEdge(1,2)
    g.addEdge(3,2)
    g.display();
    
    0 讨论(0)
  • 2020-12-02 22:05

    Assuming:

    edges = [('a', 'b'), ('a', 'b'), ('a', 'c')]
    

    Here's some code for the matrix:

    from collections import defaultdict
    
    matrix = defaultdict(int)
    for edge in edges:
        matrix[edge] += 1
    
    print matrix['a', 'b']
    
    2
    

    And for the "list":

    from collections import defaultdict
    
    adj_list = defaultdict(lambda: defaultdict(lambda: 0))
    for start, end in edges:
        adj_list[start][end] += 1
    
    print adj_list['a']
    
    {'c': 1, 'b': 2}
    
    0 讨论(0)
  • 2020-12-02 22:13

    Setting up your data structures can be pretty simple. For instance, the adjacency list example can be implemented using a defaultdict like this:

    from collections import defaultdict
    
    N = defaultdict(dict)
    

    Then when you start getting input, just do N[start][end] = weight for each inputted edge. The set of nodes will be a little more tricky to come by, if you have some nodes with no outbound edges (you'll need to union the keys of the inner dictionaries with the outer one to be sure you have them all). But a lot of algorithms will work correctly even without a complete node list.

    The adjacency matrix is a little more complicated, since you need to know the number of nodes there are in order to set its dimensions correctly. If you know it ahead of time, then its easy:

    number_of_nodes = 8
    _ = float("inf")
    
    N = [[_]*number_of_nodes for i in number_of_nodes]
    

    If you don't, you'll probably want to scan over the edges you get as input to find the highest numbered node, then use the same code above to make the matrix. For instance, if your edges are provided as a list of (start, end, weight) 3-tuples, you can use this:

    number_of_nodes = max(max(start, end) for start, end, weight in edges)
    
    0 讨论(0)
提交回复
热议问题