图的深度优先算法以及广度优先算法

def dfs(isConnected):
    # 获取当前节点的邻居节点
    def _get_first_neighbor(isConnected, cur_point):
        j = len(isConnected) - 1
        neighbor = []
        while j >= 0:
            if isConnected[cur_point][j] == 1 and cur_point != j:
                neighbor.append(j)
            j -= 1
        return neighbor

    result = ''
    # 存储邻居节点
    neighbor_stack = []
    # 存储节点的访问状态,默认都是未被访问状态
    is_visited = [False] * len(isConnected)
    for cur_point in range(len(isConnected)):
        # 如果当前节点已经被访问,则对下一个节点进行访问
        if is_visited[cur_point]:
            continue
        # 当前节点置为已被访问状态
        is_visited[cur_point] = True
        result = result + str(cur_point) + '------>'
        # 当前节点的所有邻居节点压入栈中
        neighbor_stack.extend(_get_first_neighbor(isConnected, cur_point))
        # 如果邻居节点为空,说明当前已经是最后的一个节点,否则依次对灵雎节点进行处理
        while neighbor_stack.__len__() != 0:
            # 获取邻居节点
            pop = neighbor_stack.pop()
            # 如果邻居节点已经被访问,则继续处理下一个邻居节点
            if is_visited[pop]:
                continue
            else:
                # 对邻居节点进行遍历
                result = result + str(pop) + '------>'
                # 修改邻居节点的访问状态为已访问
                is_visited[pop] = True
                # 获取邻居节点的邻居节点
                neighbor_stack.extend(_get_first_neighbor(isConnected, pop))
    return result
def bfs(isConnected):
    # 获取当前节点的邻居节点
    def _get_first_neighbor(isConnected, cur_point):
        j = 0
        neighbor = []
        while j < len(isConnected):
            if isConnected[cur_point][j] == 1 and cur_point != j:
                neighbor.append(j)
            j += 1
        return neighbor

    result = ''
    # 存储邻居节点
    neighbor_stack = []
    # 存储节点的访问状态,默认都是未被访问状态
    is_visited = [False] * len(isConnected)
    for cur_point in range(len(isConnected)):
        # 如果当前节点已经被访问,则对下一个节点进行访问
        if is_visited[cur_point]:
            continue
        # 当前节点置为已被访问状态
        is_visited[cur_point] = True
        result = result + str(cur_point) + '------>'
        # 当前节点的所有邻居节点压入栈中
        neighbor_stack.extend(_get_first_neighbor(isConnected, cur_point))
        # 如果邻居节点为空,说明当前已经是最后的一个节点,否则依次对灵雎节点进行处理
        while neighbor_stack.__len__() != 0:
            # 获取邻居节点
            pop = neighbor_stack.pop(0)
            # 如果邻居节点已经被访问,则继续处理下一个邻居节点
            if is_visited[pop]:
                continue
            else:
                # 对邻居节点进行遍历
                result = result + str(pop) + '------>'
                # 修改邻居节点的访问状态为已访问
                is_visited[pop] = True
                # 获取邻居节点的邻居节点
                neighbor_stack.extend(_get_first_neighbor(isConnected, pop))
    return result

测试

isConnected = [
    # 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
    [1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],  # 1
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 3
    [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],  # 4
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],  # 5
    [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0],  # 6
    [0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0],  # 7
    [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],  # 8
    [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0],  # 9
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1],  # 10
    [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0],  # 11
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],  # 12
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],  # 13
    [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0],  # 14
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]  # 15
]
print("dfs结果:" + dfs(isConnected))
print("dfs结果:" + bfs(isConnected))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值