【限时免费】20天拿下华为OD笔试【DFS/BFS】2023B-Linux发行版的数量【欧弟算法】全网注释最详细分类最全的华为OD真题题解

news/2024/7/20 22:31:26 标签: 算法, 华为od, 深度优先

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 说明
    • 示例一
      • 输入
      • 输出
      • 说明
  • 解题思路
  • 代码
    • 解法一:BFS
    • 解法二:DFS
    • 时空复杂度

题目描述与示例

题目描述

Linux 操作系统有多个发行版,distrowatch.com 提供了各个发行版的资料。这些发行版互相存在关联,例如 Ubuntu 基于 Debian 开发,而 Mint 又基于 Ubuntu 开发,那么我们认为 Mint 同 Debian 也存在关联。

发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。

给你一个 n x n 的关联矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个发行版和第 j 个发行版直接关联,而 isConnected[i][j] = 0 表示二者不直接相连。

返回最大的发行版集中发行版的数量。

输入描述

第一行输入发行版的总数量 N,之后每行表示各发行版间是否直接相关。

输出描述

输出最大的发行版集中发行版的数量

说明

1 <= N <= 200

示例一

输入

4
1 1 0 0
1 1 1 0
0 1 1 0
0 0 0 1

输出

3

说明

Debian(1)和 Ubuntu(2)相关,Mint(3)和 Ubuntu(2)相关,EeulerOS(4)和另外三个都不相关,所以存在两个发行版集,发行版集中发行版的数量分别是 31,所以输出 3

解题思路

本题用关联矩阵的形式表示图,类似于LC547.省份数量,但在设问上是求最大发行版集的数量,类似于LC695. 岛屿的最大面积,所以我们只需要将两题结合并稍作修改即可完成本题。

代码

解法一:BFS

# BFS
from collections import deque

n = int(input())
isConnected = list()
for _ in range(n):
    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标记为已检查过
        cur_num = 0             # cur_num表示本次BFS包含的版本数,初始化为0
        # 从版本i开始,进行BFS
        while(q):
            # 弹出q队头的版本x,考虑所有与其相连的版本y
            x = q.popleft()
            # 本次搜索得到的版本数目+1
            cur_num += 1
            # 对于版本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,比较ans和cur_num,更新ans
        ans = max(ans, cur_num)

print(ans)

解法二:DFS

# DFS
def dfs(x, isConnected, checkList):
    # 声明变量cur_num为全局变量,表示当前DFS所遍历的版本数
    global cur_num
    cur_num += 1
    # 对于传入的版本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

n = int(input())
isConnected = list()
for _ in range(n):
    isConnected.append(list(map(int, input().split())))

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

# 遍历每一个版本
for i in range(n):
    # 如果该版本没检查过,则以版本i作为起始点,进行DFS
    if checkList[i] == 0:
        # cur_num表示本次DFS包含的版本数,初始化为0
        cur_num = 0
        # 进行DFS搜索
        dfs(i, isConnected, checkList)
        # 完成本次BFS,比较ans和cur_num,更新ans
        ans = max(ans, cur_num)

print(ans)

时空复杂度

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

空间复杂度:O(N)


http://www.niftyadmin.cn/n/5233140.html

相关文章

MySQL建库建表授权练习

1、创建数据库school&#xff0c;字符集为utf8 CREATE DATABASE school CHARACTER SET utf8; 2、在school数据库中创建Student和Score表 CREATE TABLE Student (Id INT ( 10 ) AUTO_INCREMENT PRIMARY KEY,Stu_id INT(10) NOT NULL,C_name VARCHAR(20),Grade INT(10)) CR…

接口自动化测试思路和实战之模块化测试脚本框架

模块化测试脚本框架 需要创建独立的可描述的模块、程序片断以及待测试应用程序的脚本。这些小脚本进行组合&#xff0c;就能组成用来独立运行特定的测试的测试用例脚本。 场景一: 开发把 access_token接口地址由/cgi-bin/token 改为/cgi-bin/get_token或者修改参数等 》开发把…

代理模式-C++实现

代理模式是一种结构型设计模式&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者无法引用另一个对象&#xff0c;这个时候就需要一个代理对象充当客户端和目标对象之间的中介。 代理模式就是代理对象具备目标对象的所有…

部署springboot项目到GKE(Google Kubernetes Engine)

GKE是 Google Cloud Platform 提供的托管 Kubernetes 服务&#xff0c;允许用户在 Google 的基础设施上部署、管理和扩展容器。本文介绍如何部署一个简单的springboot项目到GKE. 本文使用podman. 如果你用的是docker, 只需要把本文中所有命令中的podman替换成docker即可 非H…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…

SSH:安全的远程登录和数据传输工具

SSH&#xff1a;安全的远程登录和数据传输工具 引言 在我们日常的网络操作中&#xff0c;经常需要远程控制服务器或者传输文件。如果你是一个系统管理员、开发者或者任何需要远程登录服务器的用户&#xff0c;那么SSH&#xff08;Secure Shell&#xff09;是你不可或缺的工具…

matlab 汽车单车模型固定点跟踪算法

1、内容简介 略 29-可以交流、咨询、答疑 2、内容说明 单车模型固定点跟踪算法 单车模型&#xff0c;固定点跟踪算法&#xff0c;动画演示&#xff0c; 汽车单车模型、转弯动画、固定点跟踪算法、pid控制 3、仿真分析 略 A[0,5;0,0];B[0;1]; Q10*eye(2);R1; Klqr(A…

P1 嵌入式开发之什么是Linux应用开发

目录 前言 01 .Linux应用与裸机编程、驱动编程之间的区别 1.1裸机编程&#xff1a; 1.2 驱动编程 1.3应用编程 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&a…