Python中的邻接表和邻接矩阵。

时间:2021-01-26 21:34:16

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

你好,我理解邻接表和矩阵的概念,但我对如何在Python中实现它们感到困惑:

An algorithm to achieve the following two examples achieve but without knowing the input from the start as they hard code it in their examples:

一种实现以下两个示例的算法,但不知道从一开始就输入的输入,因为它们在它们的示例中是硬编码的:

For adjacency list:

邻接表:

    a, b, c, d, e, f, g, h = range(8) 
    N = [ 
     {b:2, c:1, d:3, e:9, f:4},    # a 
     {c:4, e:3},                   # b 
     {d:8},                        # c 
     {e:7},                        # d 
     {f:5},                        # e 
     {c:2, g:2, h:2},              # f 
     {f:1, h:6},                   # g 
     {f:9, g:8}                    # h 
   ] 

For adjacency matrix:

邻接矩阵:

    a, b, c, d, e, f, g, h = range(8) 
    _ = float('inf') 
    #     a b c d e f g h
    W = [[0,2,1,3,9,4,_,_], # a 
        [_,0,4,_,3,_,_,_], # b 
        [_,_,0,8,_,_,_,_], # c 
        [_,_,_,0,7,_,_,_], # d 
        [_,_,_,_,0,5,_,_], # e 
        [_,_,2,_,_,0,2,2], # f 
        [_,_,_,_,_,1,0,6], # g 
        [_,_,_,_,_,9,8,0]] # h

Again any help will be much appreciated, Thank you!

再次感谢您的帮助,谢谢!

3 个解决方案

#1


6  

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}

#2


1  

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

设置数据结构非常简单。例如,邻接表示例可以使用如下的defaultdict实现:

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.

然后,当你开始输入的时候,只要做N[开始][结束]=每一个输入边的重量。如果您有一些没有出站边的节点(您需要将内部字典的键与外部的字典结合起来,以确保您拥有它们全部),那么将会有一些更棘手的节点。但即使没有完整的节点列表,很多算法也能正常工作。

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:

如果您不这样做,您可能想要扫描您得到的边缘,以找到最高编号的节点,然后使用上面相同的代码来创建矩阵。例如,如果您的边被提供为(开始、结束、权重)3元组的列表,您可以使用以下方法:

number_of_nodes = max(max(start, end) for start, end, weight in edges)

#3


0  

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 addEdge(self,u,v):如果你不自我。边:self。addvertex (u)如果v不在self。边缘:self。addvertex (v) if u not in self。边[v]边[v]边[v]边[v]。边缘(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();

#1


6  

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}

#2


1  

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

设置数据结构非常简单。例如,邻接表示例可以使用如下的defaultdict实现:

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.

然后,当你开始输入的时候,只要做N[开始][结束]=每一个输入边的重量。如果您有一些没有出站边的节点(您需要将内部字典的键与外部的字典结合起来,以确保您拥有它们全部),那么将会有一些更棘手的节点。但即使没有完整的节点列表,很多算法也能正常工作。

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:

如果您不这样做,您可能想要扫描您得到的边缘,以找到最高编号的节点,然后使用上面相同的代码来创建矩阵。例如,如果您的边被提供为(开始、结束、权重)3元组的列表,您可以使用以下方法:

number_of_nodes = max(max(start, end) for start, end, weight in edges)

#3


0  

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 addEdge(self,u,v):如果你不自我。边:self。addvertex (u)如果v不在self。边缘:self。addvertex (v) if u not in self。边[v]边[v]边[v]边[v]。边缘(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();