算法作业
1.以邻接表的存储方式,实现图的BFS和DFS遍历,并分析复杂度。(100分) 输入: 第一行输入两个数m, n,表示图有m个顶点(所有顶点的字母各不相同),n条边; 接下来n行每行输入两个顶点,表示这两个顶点之间有边相连; 最后一行输入遍历开始的顶点 输出: 从遍历开始的顶点出发,分别输出图的BFS和DFS遍历的结果(若某个节点存在多种遍历方式,则按照字母表顺序来进行遍历,即输出只有一种结果) 例子: 输入: 3,3 A,B A,C B,C A 输出: A,B,C A,B,C 得分标准: (1)以邻接表的存储方式实现BFS,并得到正确的输出结果获得40分 (2)以邻接表的存储方式实现DFS,并得到正确的输出结果获得40分 (3)实验报告和分析占20分 8,10 1,2 1,5 2,6 3,6 3,4 6,7 7,8
from collections import defaultdict
def sort_V(V):
for k,v in V.items():
for i in range(len(v)):
for j in range(len(v) - i - 1):
if ord(v[j]) > ord(v[j+1]):
v[j], v[j+1] = v[j + 1], v[j]
return V
# BFS
def BFS(V, start):
# 路径(已访问过的点)、队列
visited, queue = [], []
queue.append(start)
while len(queue) > 0:
start = queue[0]
visited.append(start)
queue.pop(0)
for v in V[start]:
if v not in visited and v not in queue :
queue.append(v)
return visited
def DFS(V,start,visit):
if len(visit) == len(V):
return
for v in V[start] :
if v not in visit:
visit.append(v)
DFS(V,v,visit)
if __name__ == "__main__":
m, n = map(int, input("请输入点和边的个数,以逗号分隔:").split(","))
print(m, n)
print("按序输入:相邻两点,以逗号分隔:")
# 邻接表
V = defaultdict(list)
for i in range(n):
v1, v2 = input("").split(",")
V[v1].append(v2)
V[v2].append(v1)
start = input("请输入起点:")
start_D = start
V_sorted = sort_V(V)
print(V_sorted)
V_D = V_sorted.copy()
print("BFS:", BFS(V_sorted, start))
visit = [start_D]
DFS(V_D, start_D, visit)
print("DFS:", visit)
4,7 3,7 4,8 8 ['8', '4', '7', '3', '6', '2', '1', '5'] ['8', '4', '7', '3', '6', '2', '1', '5']