Список смежности и матрица смежности в 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
снова любая помощь будет очень признательна, спасибо!
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}
настройка структуры данных может быть довольно простой. Например, пример списка смежности может быть реализован с помощью 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)
Я надеюсь, что приведенный ниже пример поможет вам он имеет как инициализированный график, так и настроенный пользователем
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):
если вы не в себе.край:
личность.addVertex (u)
если V не в себе.край:
личность.addVertex (v)
если вы не в себе.край[v]:
личность.край[v].добавить (u)
если V не в себе.край[u]:
личность.край[у].добавить(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();