算法导论--BFS,DFS及拓扑排序
class Graph(object):
_max_weight=10000
_White,_Gray,_Black=0,1,2
time = 0
def __init__(self):
self._num=0
self._g=[]
self._prev=[]
self._w=[]
self._rg=[]
self._visit=[]
self._f=[]
self._topological=[]
def _clear(self):
self.__class__.time=0
for i in range(self._num):
self._visit[i]=self.__class__._White
self._prev[i]=-1
self._w[i]=self.__class__._max_weight
self._f[i]=0
def Input(self):
self._num=input('输入顶点数:')
self.__class__.time=0
for i in range(self._num):
self._rg.append([])
self._visit.append(self.__class__._White)
self._prev.append(-1)
self._w.append(self.__class__._max_weight)
self._f.append(0)
for i in range(self._num):
v=map(int,raw_input().split())
for j in v:
self._rg[j].append(i)
self._g.append(v)
def BFS(self,s):
self._clear()
self._visit[s]=self.__class__._Gray
self._w[s]=0
queue=[]
queue.append(s)
while queue:
u=queue.pop()
for i in self._g[u]:
if self._visit[i]==self.__class__._White:
self._visit[i]=self.__class__._Gray
self._prev[i]=u
self._w[i]=self._w[u]+1
queue.append(i)
self._visit[u]=self.__class__._Black
def BFSPath(self,s,v):
if v==s:
print s,'->',
elif self._prev[v]==-1:
print 'no path from ',s,' to ',v
else:
self.BFSPath(s,self._prev[v])
print v,'->',
def DFS(self):
self._clear()
for v in range(self._num):
if self._visit[v] == self.__class__._White:
self._dfs_visit(v)
def _dfs_visit(self,u):
self._visit[u]=self.__class__._Gray
self.__class__.time+=1
self._w[u]=self.__class__.time
for v in self._g[u]:
if self._visit[v] == self.__class__._White:
self._prev[v]=u
self._dfs_visit(v)
self._visit[u]=self.__class__._Black
self.__class__.time+=1
self._f[u]=self.__class__.time
self._topological.insert(0,u)
Topological=DFS
def __str__(self):
return '\n'.join(' '.join(map(str,sublist)) for sublist in self._g)
if __name__=='__main__':
g=Graph()
g.Input()
g.BFS(0)
g.BFSPath(0,2)
#g.DFS()
g.Topological()