5G 網絡建設【華為OD機試-JAVAPythonC++JS】

題目描述

現需要在某城市進行5G網絡建設,已經選取N個地點設置5G基站,編號固定為1到N,接下來需要各個基站之間使用光纖進行連接以確保基站能互聯互通,不同基站之間架設光纖的成本各不相同,且有些節點之間已經存在光纖相連,請你設計算法,計算出能聯通這些站的最小成本是多少。
注意:基站的聯通具有傳遞性,入基站A與基站B架設了光纖,基站B與基站C也架設了光纖,則基站A與基站C視為可以互相聯通
輸入描述:第一行輸入表示基站的個數N,其中0<N<=20
第二行輸入表示具備光纖直連條件的基站對的數目M,其中0<M<N*(N-1)/2
從第三行開始連續輸入M行數據,格式為 X Y Z P,其中X Y表示基站的編號,0<X<=N,0<Y<=N且x不等于y,Z表示在X Y之間架設光纖的成本,其中0<Z<100,P表示是否已存在光纖連接,0表示未連接,1表示已連接
輸出描述:如果給定條件,可以建設成功互聯互通的5G網絡,則輸出最小的建設成本;
如果給定條件,無法建設成功互聯互通的5G網絡,則輸出-1
示例1
輸入:3
3
1 2 3 0
1 3 1 0
2 3 5 0
輸出:4
說明:只需要在1,2以及2,3基站之間鋪設光纖,其成本為3+1=4
示例2
輸入:3
1
1 2 5 0
輸出:-1
說明:3基站無法與其他基站連接,輸出-1
示例3
輸入:3
3
1 2 3 0
1 3 1 0
2 3 5 1
輸出:1
說明:2,3基站已有光纖相連,只有要再1,3站點之間鋪設光纖,其成本為1

解題思路

這個問題可以使用最小生成樹(Minimum Spanning Tree)的思想來解決,Kruskal算法是一種常用的實現方式。下面是解題思路:

  • 將所有基站之間的光纖連接按照成本從小到大排序,初始化一個并查集(Union-Find)用于記錄基站的聯通情況。
  • 遍歷排序后的光纖連接,逐個連接基站,如果連接后不形成環(即兩個基站不在同一個集合中),則將它們合并,累加連接的成本。
  • 當聯通的基站數量達到N-1時,即所有基站都聯通,停止連接。
  • 如果最終聯通的基站數量不等于N-1,說明無法建設成功互聯互通的5G網絡,輸出-1;否則輸出累加的連接成本。

題解代碼

Python題解代碼

class Solution:def findCircleNum(self, isConnected: List[List[int]]) -> int:cities = len(isConnected)visited = set()provinces = 0for i in range(cities):if i not in visited:Q = collections.deque([i])while Q:j = Q.popleft()visited.add(j)for k in range(cities):if isConnected[j][k] == 1 and k not in visited:Q.append(k)provinces += 1return provinces

JAVA題解代碼

class Solution {public int findCircleNum(int[][] isConnected) {int ans = 0, n = isConnected.length;boolean[] visit = new boolean[n];for(int i = 0; i < n; ++i){if(!visit[i]){ans++;bfs(i, visit, isConnected);}}return ans;}public void bfs(int i, boolean[] visit, int[][] isConnected){for(int j = 0; j < isConnected.length; ++j){if(isConnected[i][j] == 1 && !visit[j]){visit[j] = true;bfs(j, visit, isConnected);}}}
}

C/C++題解代碼

class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int cities = isConnected.size();vector<int> visited(cities);int provinces = 0;queue<int> Q;for (int i = 0; i < cities; i++) {if (!visited[i]) {Q.push(i);while (!Q.empty()) {int j = Q.front(); Q.pop();visited[j] = 1;for (int k = 0; k < cities; k++) {if (isConnected[j][k] == 1 && !visited[k]) {Q.push(k);}}}provinces++;}}return provinces;}
};

JS題解代碼


var findCircleNum = function(isConnected) {const cities = isConnected.length;const visited = new Set();let provinces = 0;const queue = new Array();for (let i = 0; i < cities; i++) {if (!visited.has(i)) {queue.push(i);while (queue.length) {const j = queue.shift();visited.add(j);for (let k = 0; k < cities; k++) {if (isConnected[j][k] === 1 && !visited.has(k)) {queue.push(k);}}}provinces++;}}return provinces;
};

代碼OJ評判結果

通過測試點

代碼講解

Python題解代碼解析:

這段Python代碼是用于解決一個圖的連通性問題。具體來說,該問題是要求找出城市之間的連通分量個數,其中城市之間的連通關系由isConnected矩陣表示。

  • cities表示城市的總數,即矩陣的行數和列數。
  • visited是一個集合,用于記錄已經訪問過的城市。
  • provinces用于記錄連通分量的數量。
  • 通過遍歷城市,對于每個未訪問的城市,使用廣度優先搜索(BFS)的方式找出與該城市直接或間接相連的所有城市,將它們標記為已訪問,并將連通分量數量加一。

最終返回連通分量的數量。

JAVA題解代碼解析:

該Java代碼與Python代碼功能相同,同樣是解決城市之間的連通性問題。主要結構和思路如下:

  • findCircleNum方法用于返回連通分量的數量。
  • 使用boolean數組visit記錄城市的訪問狀態。
  • 使用bfs方法進行廣度優先搜索,找出與當前城市直接或間接相連的所有城市,將它們標記為已訪問。
  • 遍歷所有城市,如果某城市未被訪問,則進行廣度優先搜索,同時將連通分量數量加一。

最終返回連通分量的數量。

C/C++題解代碼解析:

這段C++代碼與前兩段代碼實現的功能相同,解決城市之間的連通性問題,使用了BFS算法。

  • findCircleNum方法返回連通分量的數量。
  • 使用vector<int>數組visited記錄城市的訪問狀態。
  • 使用queue<int>數據結構進行廣度優先搜索,找出與當前城市直接或間接相連的所有城市,將它們標記為已訪問。
  • 遍歷所有城市,如果某城市未被訪問,則進行廣度優先搜索,同時將連通分量數量加一。

最終返回連通分量的數量。

JS題解代碼解析:

這段JavaScript代碼與前三段代碼實現的功能相同,同樣是解決城市之間的連通性問題,使用了BFS算法。

  • findCircleNum函數返回連通分量的數量。
  • 使用Set對象visited記錄城市的訪問狀態。
  • 使用數組queue進行廣度優先搜索,找出與當前城市直接或間接相連的所有城市,將它們標記為已訪問。
  • 遍歷所有城市,如果某城市未被訪問,則進行廣度優先搜索,同時將連通分量數量加一。

最終返回連通分量的數量。

寄語

🚀? 朋友,希望你的華為OD機試就像是一場輕松的技術party!愿你的代碼如同暢快的音符,跳躍在鍵盤上,最后彈奏出一曲高分之歌。加油,你是技術舞臺上的巨星!通過機試,就像是風輕云淡,輕輕松松就把高分收入囊中。祝愿你的編程之旅一路順風,破風前行,每一行代碼都是成功的注腳!🌈💻

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712388.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712388.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712388.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS7安裝MySQL5.7

查看并卸載系統自帶的 Mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 檢查系統是否安裝過MySQL rpm -qa | grep mysql 檢查有無MySQL用戶組 cat /etc/group | grep mysql cat /etc/passwd | grep mysql 創建MySQL用戶組和用戶 groupadd m…

特斯拉一面算法原題

來自太空的 X 帖子 埃隆馬斯克&#xff08;Elon Musk&#xff09;旗下太空探索技術公司 SpaceX 于 2 月 26 號&#xff0c;從太空往社交平臺 X&#xff08;前身為推特&#xff0c;已被馬斯克全資收購并改名&#xff09;發布帖子。 這是 SpaceX 官號首次通過星鏈來發送 X 帖子&a…

SpringBoot+Vue實戰:打造企業級項目管理神器

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…

【YOLO】INT8量化C++版

三、INT8量化 C++ 3.1下載coco128數據集 cd /mnt/workspace/yolov5/data/scripts sh get_coco128.sh3.2 模型準備 #onnx轉simple_onnx pip install onnx-simplifier python -m onnxsim yolov5s.onnx yolov5s-simple.onnx3.3 下載量化代碼庫 git clone https://github.com/W…

水豚鼠標助手 強大的鼠標美化工具

水豚鼠標助手 水豚鼠標助手是一款 鼠標換膚、屏幕畫筆、放大鏡、聚光燈、屏幕放大、倒計時功能的強大屏幕演示工具。 軟件助手獲取 水豚鼠標助手1.0.0 安裝教程 第一步&#xff1a;下載后&#xff0c;雙擊軟件安裝包 第二步&#xff1a;Windows可能會出現提示彈窗&#xff…

【已親測有效】如何徹底刪除nodejs,避免影響安裝新版本

第一步開始菜單搜索uninstall node.js&#xff0c;點擊之后等待刪除&#xff08;刪除node_modules文件夾以及以下這些文件&#xff09; 第二步手動刪除nodejs下載位置的其他文件夾。&#xff08;就是另外自己新建的兩個文件夾node_cache和node_global&#xff09; 到這里其實應…

uniapp實現多行文本溢出超過指定行數 展開 收起

一、組件封裝 <template><view class"multiline"><view class"info"><view :class"{hide:!iSinfo}" :style"!iSinfo?computedStyle:"><view :style"{ color: textColor,fontWeight:fontWeight,font…

網絡安全課程VIP介紹(比同行便宜)

免責聲明 本文發布的工具和腳本&#xff0c;僅用作測試和學習研究&#xff0c;禁止用于商業用途&#xff0c;不能保證其合法性&#xff0c;準確性&#xff0c;完整性和有效性&#xff0c;請根據情況自行判斷。如果任何單位或個人認為該項目的腳本可能涉嫌侵犯其權利&#xff0c…

Javaweb day7

前后端分類開發 Yapi 環境配置 vue項目簡介 項目啟動 更改端口號 vue項目開發流程

【c++設計模式05】創建型3:抽象工廠模式(Abstact Factory Pattern)

【c設計模式05】創建型3&#xff1a;抽象工廠模式&#xff08;Abstact Factory Pattern&#xff09; 一、工廠模式二、抽象工廠模式三、UML類圖四、demo五、總結 原創作者&#xff1a;鄭同學的筆記 原創地址&#xff1a;https://zhengjunxue.blog.csdn.net/article/details/132…

Spring 源碼解析

文章目錄 前言相關Spring的定義接口整體代碼StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh")prepareRefresh()obtainFreshBeanFactory()registerBeanPostProcessors(beanFactory)SpringAOP原碼流程EnableAspectJAutoProxyAnno…

Linux調試器-gdb使用與馮諾依曼體系結構

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言 Linux調試器-gdb使用 1. 背景 2. 開始使用 馮諾依曼體系結構 總結 前言 世上有兩種耀眼的光芒&#xff0c;一種是正在升起的太陽&#xff0c;一種是正在努力學…

計算機網絡-網絡互連和互聯網(五)

1.路由器技術NAT&#xff1a; 網絡地址翻譯&#xff0c;解決IP短缺&#xff0c;路由器內部和外部地址進行轉換。靜態地址轉換&#xff1a;靜態NAT&#xff08;一對一&#xff09; 靜態NAT&#xff0c;內外一對一轉換&#xff0c;用于web服務器&#xff0c;ftp服務器等固定IP的…

(定時器/計數器)中斷系統(詳解與使用)

講解 簡介 定時器/計數器 定時器實際上也是計數器,只是計數的是固定周期的脈沖 定時和計數只是觸發來源不同(時鐘信號和外部脈沖)其他方面是一樣的。 定時器在單片機內部就像一個小鬧鐘一樣,根據時鐘的輸出信號,每隔“一秒”,計數單元的數值就增加一,當計數單元數值…

C++:String類的使用

創作不易&#xff0c;感謝三連&#xff01;&#xff01; 在C語言中&#xff0c;我們想要存儲字符串的話必須要用字符數組 char str[]"hello world"這其實是將在常量區的常量字符串拷貝到數組中&#xff0c;我們會在數組的結尾多開一個空間存儲\0&#xff0c;這樣我…

前端構建之CERT_HAS_EXPIRED和certificate has expired解決方案

問題 2024年 1 月 22 日&#xff0c;淘寶原鏡像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 證書正式到期。如果想要繼續使用&#xff0c;需要將 npm 源切換到新的源&#xff08;registry.npmmirror.com&#xff09;&#xff0c;否則會報錯。 報錯信息為&a…

Consul服務注冊與發現 Consul配置步驟

Consul服務注冊與發現 Consul配置步驟 consul下載地址 Install | Consul | HashiCorp Developer 啟動需要在 下載好的文件夾里 用cmd 運行consul agent -dev啟動consul Consul配置 配置pom <!--SpringCloud consul config--> <dependency><groupId>org…

【leetcode】回文子串 動態規劃

/*** param {string} s* return {number}*/ var countSubstrings function(s) {let dpnew Array(s.length).fill().map(()>new Array(s.length).fill(false));let num0;for(let i0;i<s.length;i){for(let j0;j<i;j){//在首尾相等時&#xff0c;如果長度時1或者2&…

C++筆記(三)--- 函數重載

目錄 子類繼承父類重載 類成員函數重載 繼承和組合的三種方式請看我上一篇文章 C筆記&#xff08;二&#xff09;--- 繼承和組合-CSDN博客 子類繼承父類重載 當子類繼承父類之后&#xff0c;子類重新定義了一個和父類完全相同函數名稱的函數時&#xff0c;會將父類所有相同…

Pegasus智能家居套件樣例開發--軟定時器

樣例簡介 此樣例將演示如何在Pegasus Wi-Fi IoT智能家居套件上使用cmsis 2.0 接口進行定時器開發。 工程版本 系統版本/API版本&#xff1a;OpenHarmony 3.0 releaseIDE版本&#xff1a;DevEco Device Tool Release 3.0.0.401 快速上手 準備硬件環境 預裝windows系統的PC…