Skip to content

Commit cb766ff

Browse files
Merge pull request #300 from free-free/master
Update 31_bfs_dfs
2 parents 75d7cd0 + 45b91fd commit cb766ff

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

python/31_bfs_dfs/graph.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# -*- coding:utf-8 -*-
2+
3+
4+
class Undigraph(object):
5+
6+
7+
def __init__(self, vertex_num):
8+
self.v_num = vertex_num
9+
self.adj_tbl = []
10+
for i in range(self.v_num + 1):
11+
self.adj_tbl.append([])
12+
13+
def add_edge(self, s, t):
14+
if s > self.v_num or t > self.v_num:
15+
return False
16+
self.adj_tbl[s].append(t)
17+
self.adj_tbl[t].append(s)
18+
return True
19+
20+
def __len__(self):
21+
return self.v_num
22+
23+
def __getitem__(self, ind):
24+
if ind > self.v_num:
25+
raise IndexError("No Such Vertex!")
26+
return self.adj_tbl[ind]
27+
28+
def __repr__(self):
29+
return str(self.adj_tbl)
30+
31+
def __str__(self):
32+
return str(self.adj_tbl)
33+
34+
35+
class Digraph(object):
36+
37+
38+
def __init__(self, vertex_num):
39+
self.v_num = vertex_num
40+
self.adj_tbl = []
41+
for i in range(self.v_num + 1):
42+
self.adj_tbl.append([])
43+
44+
def add_edge(self, frm, to):
45+
if frm > self.v_num or to > self.v_num:
46+
return False
47+
self.adj_tbl[frm].append(to)
48+
49+
def __len__(self):
50+
return self.v_num
51+
52+
def __getitem__(self, ind):
53+
if ind > self.v_num:
54+
raise IndexError("No such vertex!")
55+
return self.ajd_tbl[ind]
56+
57+
def __repr__(self):
58+
return str(self.adj_tbl)
59+
60+
def __str__(self):
61+
return str(self.adj_tbl)
62+
63+
64+
if __name__ == '__main__':
65+
ug = Undigraph(10)
66+
ug.add_edge(1, 9)
67+
ug.add_edge(1, 3)
68+
ug.add_edge(3, 2)
69+
print(ug.adj_tbl)
70+
71+
dg = Digraph(10)
72+
dg.add_edge(1, 9)
73+
dg.add_edge(1, 3)
74+
dg.add_edge(3, 4)
75+
print(dg.adj_tbl)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# -*- coding:utf-8 -*-
2+
3+
4+
5+
from collections import deque
6+
from graph import Undigraph
7+
8+
def find_vertex_by_degree(graph, s, degree):
9+
if len(graph) <= 1:
10+
return []
11+
if degree == 0:
12+
return [s]
13+
d_vertices = []
14+
queue = deque()
15+
prev = [-1] * len(graph)
16+
visited = [False] * len(graph)
17+
visited[s] = True
18+
queue.append(s)
19+
while len(queue) > 0:
20+
sz = len(queue)
21+
for i in range(sz):
22+
v = queue.popleft()
23+
for adj_v in graph[v]:
24+
if not visited[adj_v]:
25+
prev[adj_v] = v
26+
visited[adj_v] = True
27+
queue.append(adj_v)
28+
degree -= 1
29+
if degree == 0 and len(queue) != 0:
30+
return queue
31+
32+
33+
if __name__ == '__main__':
34+
g = Undigraph(8)
35+
g.add_edge(0, 1)
36+
g.add_edge(0, 3)
37+
g.add_edge(1, 2)
38+
g.add_edge(1, 4)
39+
g.add_edge(2, 5)
40+
g.add_edge(3, 4)
41+
g.add_edge(4, 5)
42+
g.add_edge(4, 6)
43+
g.add_edge(5, 7)
44+
g.add_edge(6, 7)
45+
print(find_vertex_by_degree(g, 0, 4))

0 commit comments

Comments
 (0)