-
-
Notifications
You must be signed in to change notification settings - Fork 806
Expand file tree
/
Copy pathgraph.py
More file actions
95 lines (68 loc) · 1.95 KB
/
graph.py
File metadata and controls
95 lines (68 loc) · 1.95 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
# -*- coding: utf-8 -*-
from collections import deque
GRAPH = {
'A': ['B', 'F'],
'B': ['C', 'I', 'G'],
'C': ['B', 'I', 'D'],
'D': ['C', 'I', 'G', 'H', 'E'],
'E': ['D', 'H', 'F'],
'F': ['A', 'G', 'E'],
'G': ['B', 'F', 'H', 'D'],
'H': ['G', 'D', 'E'],
'I': ['B', 'C', 'D'],
}
class Queue(object):
def __init__(self):
self._deque = deque()
def push(self, value):
return self._deque.append(value)
def pop(self):
return self._deque.popleft()
def __len__(self):
return len(self._deque)
def bfs(graph, start):
search_queue = Queue()
search_queue.push(start)
searched = set()
while search_queue: # 队列不为空就继续
cur_node = search_queue.pop()
if cur_node not in searched:
print(cur_node)
searched.add(cur_node)
for node in graph[cur_node]:
search_queue.push(node)
print('bfs:')
bfs(GRAPH, 'A')
DFS_SEARCHED = set()
def dfs(graph, start):
if start not in DFS_SEARCHED:
print(start)
DFS_SEARCHED.add(start)
for node in graph[start]:
if node not in DFS_SEARCHED:
dfs(graph, node)
print('dfs:')
dfs(GRAPH, 'A')
class Stack(object):
def __init__(self):
self._deque = deque()
def push(self, value):
return self._deque.append(value)
def pop(self):
return self._deque.pop()
def __len__(self):
return len(self._deque)
def dfs_use_stack(graph, start):
stack = Stack()
stack.push(start)
searched = set()
while stack:
cur_node = stack.pop()
if cur_node not in searched:
print(cur_node)
searched.add(cur_node)
# 请读者思考这里我为啥加了 reversed,其实不加上是可以的,你看下代码输出
for node in reversed(graph[cur_node]):
stack.push(node)
print('dfs_use_stack:')
dfs_use_stack(GRAPH, 'A')