06-图1 列出连通集(Python)——(6)

解题思路:

首先确定实现思路,使用邻接矩阵还是邻接表。因为数据量不大,故采用邻接矩阵。
因为采用了邻接矩阵,所以定义出邻接矩阵和访问矩阵。在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的具体实现过程,参考了这篇文章。这位博主整理了浙大数据结构和算法的所有思考题和算法题,在学习的过程中很值得借鉴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值