Список смежности и матрица смежности в 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

Снова любая помощь будет высоко оценена, спасибо!


person Baraa    schedule 25.11.2012    source источник
comment
Не зная ввода ‹-- можете ли вы уточнить это утверждение?   -  person tommy.carstensen    schedule 25.11.2012
comment
Например, я знаю, что будут входные данные для создания списка или матрицы смежности, но я не знаю, какими будут входные данные, поэтому в основном для того, чтобы иметь алгоритм, в котором всякий раз, когда у меня есть входные данные вершин и ребер для создания списка смежности или матрицы...   -  person Baraa    schedule 25.11.2012
comment
Что представляет собой бесконечность в матрице смежности?   -  person Eric    schedule 25.11.2012
comment
Это всего лишь пример того, как недостающее ребро равно бесконечности, вы можете игнорировать это и думать об этом как об отсутствии ребра.   -  person Baraa    schedule 25.11.2012
comment
Итак, что представляет собой 0? Мне кажется, что они у вас неправильные.   -  person Eric    schedule 25.11.2012
comment
Ноль для идентификации, я полагаю. Это может не подходить для некоторых видов графов, где у вас могут быть регулярные зацикленные ребра. Это также может сломать некоторые наивные алгоритмы (которые будут бесконечно зацикливаться без какого-либо прогресса).   -  person Blckknght    schedule 25.11.2012
comment
Это часть задания по программированию, это скорее список смежности, с которым у меня возникают проблемы, особенно потому, что я программирую на питоне, в С++ у меня может быть массив, а не указатели на узлы, которые связаны количеством ребер, которые Я не уверен, как реализовать в python, когда дело доходит до матрицы смежности, я чувствую, что ее проще реализовать, поскольку это всего лишь двумерный массив с вводом количества ребер в двумерном массиве.   -  person Baraa    schedule 25.11.2012


Ответы (3)


Предполагая:

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}
person Eric    schedule 25.11.2012
comment
Двое из вас упомянули defaultdict, и, поскольку я новичок в Python, я не совсем уверен, что это значит, не могли бы вы поделиться некоторыми соображениями по этому поводу? Спасибо за примеры, хотя они помогут! - person Baraa; 25.11.2012
comment
@user1748026 Тип defaultdict работает так же, как словарь, но вы предоставляете ему заводская функция при настройке. Затем, если вы получите доступ к ключу, который не существует, он вызовет фабричную функцию, чтобы создать значение по умолчанию для этого ключа. - person Blckknght; 25.11.2012
comment
@Eric: Мне нравится ваше решение для матрицы на основе индекса кортежа. Для версии списка вы можете использовать int в качестве фабричной функции для вашего внутреннего defaultdict, а не другую лямбда-функцию. - person Blckknght; 25.11.2012

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

from collections import defaultdict

N = defaultdict(dict)

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

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

number_of_nodes = 8
_ = float("inf")

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

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

number_of_nodes = max(max(start, end) for start, end, weight in edges)
person Blckknght    schedule 25.11.2012
comment
Спасибо за ваш вклад, кажется, мне нужно еще многому научиться, когда дело доходит до того, как вы можете кодировать вещи в python, такие вещи, как number_of_nodes = max(max(start, end) для начала, конца, вес в ребрах) , спасибо за вклад, и я собираюсь попробовать работать с некоторыми из вещей, которые вы предоставили! - person Baraa; 25.11.2012
comment
Будет ли это создавать матрицу смежности, когда, скажем, отсутствуют некоторые строки (например, узлы 1 2 5 6. Будет ли это создавать матрицу 6X6 или 4x4?) - person ubuntu_noob; 28.10.2017

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

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