Skip to content

Instantly share code, notes, and snippets.

@Kyly
Last active August 29, 2015 14:20
Show Gist options
  • Save Kyly/8c8c52349e3d1b2c7a9f to your computer and use it in GitHub Desktop.
Save Kyly/8c8c52349e3d1b2c7a9f to your computer and use it in GitHub Desktop.
class vert:
def __init__(self, id):
self.id = id
self.adj = []
self.pre = 0
self.post = 0
self.visited = False
def __repr__(self):
return "< {} pre:{} post:{} visited:{} >".format(self.id, self.pre, self.post, self.visited)
A = vert('A')
B = vert('B')
C = vert('C')
D = vert('D')
E = vert('E')
F = vert('F')
G = vert('G')
H = vert('H')
A.adj = [C]
B.adj = [C]
C.adj = [D, E]
D.adj = [F]
E.adj = [F]
F.adj = [G, H]
graph = [A,B,C,D,E,F,G,H]
clock = 1
def pre(v):
global clock
v.pre = clock
clock += 1
def post(v):
global clock
v.post = clock
clock += 1
def explore(v):
pre(v)
v.visited = True
for u in v.adj:
if not u.visited: explore(u)
post(v)
def DFS(G):
global clock
clock = 1
for v in G:
v.visited = False
for v in G:
if not v.visited: explore(v)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Solution
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
def findSource(G):
max_post = None
for v in G:
if max_post == None:
max_post = v
elif max_post.post < v.post:
max_post = v
return max_post
def reachableFromS(G):
DFS(G) # Assign post numbers
source = findSource(G) # Get highest post value
for v in G: # Clear visited fields
v.visited = False
explore(source) # Explore from source vertex
for v in G: # Check if all vertices have been visited
if not v.visited:
return False
return True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment