解题思路:
首先确定实现思路,使用邻接矩阵还是邻接表。因为数据量不大,故采用邻接矩阵。
因为采用了邻接矩阵,所以定义出邻接矩阵和访问矩阵。在Python中,二维矩阵定义较特殊:
ListMat = [[0] * 11 for i in range(12)]
完成11×11矩阵定义。
下面确定主函数:
1、模块化实现读取输入函数,而不是在主函数中写读取输入的具体代码。
2、DFS和BFS函数。
具体代码实现如下:
#使用邻接矩阵来进行运算
from collections import deque
# 定义邻接矩阵
ListMat = [[0] * 11 for i in range(12)]
# 定义访问矩阵
VisitMat = [0] * 11
def main():
#读取输入的数据
InputNum = list(map(int,input().split()))
#初始化矩阵
initGraph(InputNum[0])
#生成图
geneGraph(InputNum[1])
#深度优先搜索
ErgDFS(InputNum[0])
#把Visit矩阵初始化
recoVisit(InputNum[0])
#广度优先搜素
ErgBFS(InputNum[0])
#初始化函数
def initGraph(N):
for i in range(N):
VisitMat[i] = 0
for j in range(N):
ListMat[i][j] = 0
if i == j:
ListMat[i][j] = 1
#恢复VisitMat函数
def recoVisit(N):
for i in range(N):
VisitMat[i] = 0
#生成图函数
def geneGraph(E):
for i in range(E):
Dot = list(map(int,input().split()))
ListMat[Dot[0]][Dot[1]] = 1
ListMat[Dot[1]][Dot[0]] = 1
#深度优先搜索函数
def ErgDFS(N):
for i in range(N):
if VisitMat[i] == 0:
print("{",end=" ")
DFS(i, N)
print("}")
def DFS(i, N):
VisitMat[i] = 1
print(i,end=" ")
for j in range(N):
if (ListMat[i][j] == 1 and VisitMat[j] == 0):
VisitMat[j] = 1
DFS(j,N)
#广度优先搜索算法
def ErgBFS(N):
for i in range(N):
if VisitMat[i] == 0:
print("{",end=" ")
BFS(i,N)
print("}")
def BFS(i,N):
VisitMat[i] = 1
queue = deque()
queue.append(i)
while queue:
result = queue.popleft()
print(result,end=" ")
for j in range(N):
if (ListMat[result][j]==1 and VisitMat[j]==0):
queue.append(j)
VisitMat[j] = 1
if __name__ == "__main__":
main()
程序的提交结果:
关于程序中DFS和BFS的具体实现过程,参考了这篇文章。这位博主整理了浙大数据结构和算法的所有思考题和算法题,在学习的过程中很值得借鉴。