【限时免费】20天拿下华为OD笔试之【DFS/BFS】2023Q2-广播服务器【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解

【DFS/BFS】2023Q2-广播服务器

题目描述与示例

题目

服务器连接方式包括直接相连,间接连接。AB 直接连接,BC 直接连接,则 AC 间接连接。 直接遵接和间接连接都可以发送广播。 给出一个大小为 N*N 的二维矩阵matrix,代表 N 个服务器。matrix[i][j] = 1,则代表 ij 直接连接;matrix[i][j] = 0 时,代表 ij 不直接连接。matrix[i][j]==1,即自己和自已直接连接。 计算初始需要给几合服务器广播,才可以使每个服务器都收到广播。

输入

输入为 N 行,每行有 N 个数字,为 01,由空格分隔,构成 N*N 的二维矩阵matrixN 的范围为 1 <= N <= 40

输出

输出一个数字,为需要广播的服务器的数量。

示例一

输入

1 0 0
0 1 0
0 0 1

输出

3

示例二

输入

1 1
1 1

输出

1

解题思路

本题和LC547.省份数量不能说毫无联系,只能说一模一样。

代码

解法一:BFS

# 题目:2023Q2-广播服务器
# 分值:200
# 作者:闭着眼睛学数理化
# 算法:BFS
# 代码看不懂的地方,请直接在群上提问


from collections import deque

isConnected = list()
# 先输入第一行
isConnected.append(list(map(int, input().split())))
# 根据第一行的长度,得到n
n = len(isConnected[0])
# 输入剩余的n-1行
for _ in range(n-1):
    isConnected.append(list(map(int, input().split())))

ans = 0
checkList = [0] * n     # 构建检查数组checkList

# 遍历每一个服务器
for i in range(n):
    if checkList[i] == 0:       # 若服务器i未检查过
        q = deque([i])          # 把服务器i加入q中,作为BFS的起始位置
        checkList[i] = 1        # 将服务器i标记为已检查过
        # 从服务器i开始,进行BFS
        while(q):
            # 弹出q队头的服务器x,考虑所有与其相连的服务器y
            x = q.popleft()
            # 对于服务器x,遍历所有其他服务器y,若y未检查过,且与x相连
            for y in range(n):
                if x != y and checkList[y] == 0 and isConnected[x][y] == 1:
                    q.append(y)         # 则把服务器y加入队列中
                    checkList[y] = 1    # 同时把服务器y标记为已检查过
        # 完成本次BFS,连通分量+1,即ans+1
        ans += 1

print(ans)

解法二:DFS

# 题目:2023Q2-广播服务器
# 分值:200
# 作者:闭着眼睛学数理化
# 算法:DFS
# 代码看不懂的地方,请直接在群上提问


# dfs递归寒素
def dfs(x, isConnected, checkList):
    # 对于传入的服务器x,将其标记为已检查过
    checkList[x] = 1
    # 遍历其他服务器y,若服务器y未检查过,且与服务器x相连
    for y in range(n):
        if y != x and checkList[y] == 0 and isConnected[x][y] == 1:
            dfs(y, isConnected, checkList)  # 则对y进行DFS

isConnected = list()
# 先输入第一行
isConnected.append(list(map(int, input().split())))
# 根据第一行的长度,得到n
n = len(isConnected[0])
# 输入剩余的n-1行
for _ in range(n-1):
    isConnected.append(list(map(int, input().split())))

ans = 0
checkList = [0] * n         # 构建检查数组checkList

# 遍历每一个服务器i
for i in range(n):
    # 如果该服务器没检查过,则以服务器i作为起始点,进行DFS
    if checkList[i] == 0:
        # 进行DFS搜索
        dfs(i, isConnected, checkList)
        # 完成本次DFS,连通分量+1,即ans+1
        ans += 1

print(ans)

时空复杂度

时间复杂度:O(N^2)。需要遍历整个关联矩阵 isConnected

空间复杂度:O(N)

华为OD算法冲刺训练

  • 华为OD算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 30+天陪伴式学习,20+直播课时,300+动画图解视频,200+LeetCode经典题,100+华为OD真题,还有简历修改与模拟面试将为你解锁

  • 可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 sheepvipvip了解更多

你可能感兴趣的:(最新华为OD真题,#,BFS,#,DFS,华为od,深度优先,宽度优先)