Подтвердить что ты не робот

Список смежности и матрица смежности в Python

Здравствуйте, я понимаю понятия списка смежности и матрицы, но я смущен тем, как их реализовать в Python:

Алгоритм для достижения следующих двух примеров достигает, но не знает ввода с самого начала, поскольку они жестко кодируют его в своих примерах:

Для списка смежности:

    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 
   ] 

Для матрицы смежности:

    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

Снова любая помощь будет очень признательна, спасибо!

4b9b3361

Ответ 1

Предполагая, что:

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

Вот некоторый код для матрицы:

from collections import defaultdict

matrix = defaultdict(int)
for edge in edges:
    matrix[edge] += 1

print matrix['a', 'b']
2

И для "списка":

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

Настройка структур данных может быть довольно простой. Например, пример списка смежности может быть реализован с помощью defaultdict следующим образом:

from collections import defaultdict

N = defaultdict(dict)

Затем, когда вы начинаете вводить ввод, просто N[start][end] = weight для каждого введенного края. Множество узлов будет немного сложнее, если у вас есть некоторые узлы без исходящих ребер (вам нужно объединить ключи внутренних словарей с внешним, чтобы быть уверенным, что у вас есть все). Но многие алгоритмы будут работать корректно даже без полного списка node.

Матрица смежности немного сложнее, так как вам нужно знать количество узлов, чтобы правильно установить его размеры. Если вы это знаете заранее, то легко:

number_of_nodes = 8
_ = float("inf")

N = [[_]*number_of_nodes for i in number_of_nodes]

Если вы этого не сделаете, вы, вероятно, захотите просмотреть по краям, которые вы получаете в качестве входных данных, чтобы найти наивысший номер node, а затем использовать тот же код, что и для создания матрицы. Например, если ваши ребра представлены в виде списка (start, end, weight) 3-кортежей, вы можете использовать это:

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

Ответ 3

Я надеюсь, что приведенный ниже пример поможет вам он имеет как Initialized Graph, так и пользовательский

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):       если u не в self.edge:           self.addVertex(и)       если v не в self.edge:           self.addVertex(v)       если u не в self.edge [v]:           self.edge [v].append(и)       если v не в self.edge [u]:           self.edge [и].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();