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 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!
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}
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)
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();
来源:https://stackoverflow.com/questions/13547133/adjacency-list-and-adjacency-matrix-in-python