forked from heineman/python-algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgraph.py
More file actions
110 lines (76 loc) · 2.29 KB
/
graph.py
File metadata and controls
110 lines (76 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# Adjacency list Graph Implementation
class Graph:
def __init__(self):
"""Construct Empty Graph"""
self.edges = {}
def addVertex(self, v):
"""Add vertex to graph (if not already present)"""
if v not in self.edges:
self.edges[v] = []
def addEdge(self, from_v, to_v):
"""Add edge to graph"""
if from_v not in self.edges:
self.edges[from_v] = []
if to_v not in self.edges:
self.edges[to_v] = []
if to_v not in self.edges[from_v]:
self.edges[from_v].append(to_v)
if from_v not in self.edges[to_v]:
self.edges[to_v].append(from_v)
def isEdge(self, from_v, to_v):
"""Determines whether edge exists"""
if to_v not in self.edges:
return False
if from_v not in self.edges:
return False
return to_v in self.edges[from_v]
simple = {1 : [2, 3, 5],
2 : [1, 4],
3 : [1],
4 : [2, 5],
5 : [1, 4] }
def loadGraph (edges):
"""Create a graph instance"""
g = Graph()
for v in edges:
g.addVertex(v)
for neighbor in edges[v]:
g.addEdge(v, neighbor)
return g
White = 0
Gray = 1
Black = 2
class DepthFirstTraversal:
def __init__(self, graph, s):
"""Initiate a DFS traversal of graph"""
self.graph = graph
self.start = s
self.color = {}
self.pred = {}
for v in graph.edges:
self.color[v] = White
self.pred[v] = None
self.dfs_visit(s)
def dfs_visit(self, u):
"""Recursive traversal of graph using DFS"""
self.color[u] = Gray
for v in self.graph.edges[u]:
if self.color[v] is White:
self.pred[v] = u
self.dfs_visit(v)
self.color[u] = Black
def solution(self, v):
"""Recover path from start to this vertex v"""
if v not in self.graph.edges:
return None
if self.pred[v] is None:
return None
path = [v]
while v != self.start:
v = self.pred[v]
path.insert(0, v)
return path
"""
Change Log
1. 2014.05.23 Typo in name for 'DepthFirstTraversal'
"""