hnust 1966: 廣度優先搜索

hnust 1966: 廣度優先搜索

題目描述
輸入一個圖,用鄰接表存儲(實際上也可以選擇鄰接矩陣),并實現BFS操作。

拷貝前面已經實現的代碼,主函數必須如下,完成剩下的部分。

int main()
{
Graph g;
CreateUDG(g);
BFS(g, 0);//從0號頂點開始遍歷
DestroyUDG(g);
return 0;
}//main

輸入
輸入的第一行是兩個整數,分別是圖的總頂點數n和總邊數e

第二行是n個空格分開的字符串,是頂點的名字,依次對應編號0~n-1。

隨后有e行,每行兩個空格分開的頂點名字,表示一條邊的兩個頂點。

具體見樣例。

輸出

輸出圖的BFS序列,遍歷次序按教材,每個頂點后面跟一個空格。

具體見樣例。

樣例輸入 Copy
8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v2 v5
v3 v6
v3 v7
v4 v8
v5 v8
v6 v7
樣例輸出 Copy
v1 v2 v3 v4 v5 v6 v7 v8
提示
樣例對應教材6.5的圖G4

解題過程

注:本題按照書上算法解析完成,廣度優先搜索的細化代碼及函數分解請看合集《2024.6 hnust 23級 數據結構 課程設計》“推箱子游戲-廣度優先搜索版本”
圖的廣度優先搜索(BFS)需要借助到隊列來遍歷:
①首先,選取圖中某一頂點vi作為出發點,訪問后將其入隊并標記為已訪問(使用隊列用于避免重復訪問,存放已經訪問過的各鄰接頂點);
②依次訪問與vi鄰接的頂點,即當隊列不為空時檢查出隊頂點的所有鄰接頂點,訪問未被訪問的鄰接頂點并將其入隊,重復該過程;【可概括為由起始頂點開始,按照廣度優先的順序逐層遍歷與當前頂點相鄰的頂點將其訪問】
③當隊列為空時跳出循環,即所有已被訪問的頂點的鄰接頂點均被訪問到,則此時遍歷完成。

(二)BFS的空間復雜度和時間復雜度
對于一個圖G=(V,E),由頂點集V和邊集E組成。
1、BFS算法的空間復雜度
通過BFS遍歷的空間復雜度為O(|V|)。

2、BFS算法的時間復雜度
時間復雜度取決于圖的存儲結構,若通過鄰接矩陣表示圖,則查找頂點的鄰接頂點所需時間為O(|V|),總時間復雜度為O(|V2|)(鄰接矩陣為方陣n×n),這和DFS算法的時間復雜度是一樣的;若通過鄰接表表示圖,則每個頂點都入隊一次,即所需時間為O(|V|),搜索頂點的鄰接頂點所需時間為O(|E|),其時間復雜度為O(|V|+|E|)。

這段C++代碼實現了一個基于廣度優先搜索(BFS)的無向圖的拓撲排序算法。以下是對代碼的詳細解析:

  1. 頭文件和命名空間

    • 包含 <bits/stdc++.h> 頭文件,它包含了標準庫中的大部分內容。
    • 使用 using namespace std; 來避免在標準庫類型和函數前加 std::
  2. 讀取圖的參數

    • 讀取兩個整數 ne,分別代表圖中頂點的數量和邊的數量。
  3. 存儲頂點信息

    • 創建一個字符串數組 nodes 來存儲頂點的名稱。
  4. 輸入頂點名稱

    • 使用循環讀取 n 個頂點的名稱。
  5. 建立頂點位置映射

    • 使用 map(映射)來存儲每個頂點名稱與其在數組中的索引位置。
  6. 創建無向圖

    • 使用 map 來創建一個鄰接表 G,表示無向圖中的邊。
  7. 對鄰接表進行排序

    • 對每個頂點的鄰接表進行排序,以便在后續的搜索中按順序訪問。
  8. 初始化訪問標記

    • 使用 map 初始化所有頂點的訪問狀態為未訪問。
  9. 使用隊列實現BFS

    • 使用 queue 來實現BFS,首先將起始頂點壓入隊列,并標記為已訪問。
  10. BFS搜索

    • 當隊列不為空時,執行循環:
      • 彈出隊列前端元素作為當前訪問的頂點,并輸出。
      • 遍歷當前頂點的所有鄰接頂點。
      • 如果鄰接頂點未被訪問,將其標記為已訪問,并壓入隊列。
  11. 輸出訪問順序

    • 在訪問過程中,每訪問一個頂點,就輸出其名稱。
  12. 程序結束

    • 當隊列為空時,表示所有頂點都被訪問完畢,程序結束。

代碼邏輯分析

  • 這段代碼通過BFS實現了拓撲排序,適用于無向圖。
  • 使用隊列來存儲待訪問的頂點,使用映射來記錄頂點的訪問狀態和位置信息。

潛在問題

  • 代碼中注釋掉的部分提供了另一種實現拓撲排序的方法,但在當前實現中未使用。

改進建議

  • 考慮使用 std::vector 替代數組,以提高代碼的安全性和靈活性。
  • 考慮使用 std::unordered_map 替代 std::map,以提高查找效率。
  • 如果需要處理更大的圖或更復雜的圖結構,可以考慮優化內存使用和搜索算法。
  • 代碼中的排序部分可能不是必要的,因為拓撲排序的目的是線性化圖,而不是排序頂點。如果不需要對頂點進行排序,可以省略排序邏輯。

AC代碼

#include<bits/stdc++.h>
using namespace std;int main(int argc, char const *argv[])
{map < string , std::vector<string> >  G;int n ,e;cin>> n >> e;  //輸入:8 9string nodes[n];for (int i = 0; i < n; ++i){cin >> nodes[i];  //輸入:v1 v2 v3 v4 v5 v6 v7 v8}map <string , int > location;for (int i = 0; i < n; ++i)   //排序數組{location[nodes[i]] = i;}for (int i = 0; i < e; ++i)  //創建無向圖{string l,r;cin >> l >> r;G[l].push_back(r);G[r].push_back(l);}for (int i = 0; i < n; ++i)  //對無向圖的排序{int j = G[nodes[i]].size();for (int p = 0; p < j; ++p){for (int q = 0; q < j; ++q){if(location[G[nodes[i]][q]] > location[G[nodes[i]][p]]){string temp;temp = G[nodes[i]][q];G[nodes[i]][q] = G[nodes[i]][p];G[nodes[i]][p] = temp;}}}}map < string , bool > vis;  //是否被訪問queue < string > q;q.push(nodes[0]);vis[nodes[0]] = true;// string rev[n];// int r = 0;while(q.size()){string curr;curr = q.front();  q.pop();// rev[r++] = curr;cout << curr << " ";for(auto next : G[curr]){if(!vis[next]){vis[next] = true;q.push(next);}}}return 0;
}

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

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

相關文章

ffmpeg 文檔 - 未完

寫在前面: 筆記的目錄是為了總結他人的話, 從而讓自己更專注閱讀理解與框架思路整理, 忌大而詳細。 原文: ffmpeg 文檔 1 概要 ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...ffmpeg 是一個通用的 媒體轉換器. 讀…

ChatGPT對話:python程序模擬操作網頁彈出對話框

【編者按】單擊一網頁中的按鈕&#xff0c;彈出對話框網頁&#xff0c;再單擊其中的“Yes”按鈕&#xff0c;對話框關閉&#xff0c;請求并獲取新網頁。 可能ChatGPT第一次沒有正確理解描述問題的含義&#xff0c;再次說明后&#xff0c;程序編寫就正確了。 1問&#xff1a;pyt…

全網最全的接口文檔速成

文章目錄 接口文檔內容前言1. 前后端分離開發1.1 介紹1.2 開發流程1.3 前端技術棧 2. Yapi2.1 介紹2.2 使用2.2.1 準備2.2.2 定義接口2.2.3 導出接口文檔2.2.4 導入接口文檔 3. Swagger3.1 介紹3.2 使用方式3.3 查看接口文檔3.4 常用注解3.4.1 問題說明3.4.2 注解介紹3.4.3 注解…

Redis實戰—秒殺優化(Redis消息隊列)

回顧 我們回顧一下前文下單的流程&#xff0c;當用戶發起請求&#xff0c;此時會請求nginx&#xff0c;nginx會訪問到tomcat&#xff0c;而tomcat中的程序&#xff0c;會進行串行操作&#xff0c;分成如下幾個步驟。 1、查詢優惠卷 2、判斷秒殺庫存是否足夠 …

【代碼隨想錄算法訓練營第六十三天|卡碼網117.軟件構造、47.參加科學大會】

文章目錄 117.軟件構造47.參加科學大會 117.軟件構造 本體考察的是拓撲排序的思路&#xff0c;對于所有的有向無環圖進行拓撲排序后輸出的長度一定是和原結點數相同的。整體思路是找到當前所有的入度為0的結點&#xff0c;添加到結果中&#xff0c;并且查看對應的后續結點將其…

文獻筆記|綜述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 題目&#xff1a;當大型語言模型遇到優化時 作者&#xff1a;Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 來源&#xff1a;arXiv 單位&#xff1a;華南理工大學 文章目錄 When Large Language Model Meets Optimization…

springboot打包異常 Type org.springframework.boot.maven.RepackageMojo not present

解決&#xff1a; 項目在本地時可以正常啟動的,但是打包就報錯,經過分析得出,應該是打包依賴的問題,解決方法: 在pom文件中的build—>plugins---->plugin中添加spring-boot-maven-plugin依賴的版本號如下: 2.4.3 指定版本號即可。

IT審計必看!對比舊版,CISA考試改版升級亮點和重點內容是什么?

官方通知&#xff0c;今年8月1日&#xff0c;CISA新版考綱正式上線&#xff0c;舊版在7月23日后就無法約考了。 艾威培訓邀請了國內知名的IT審計CISA授課老師吳老師來為大家詳細講解CISA新版考綱的變化 目前第28th版教材只有英文版&#xff0c;中文版尚未發布。我們艾威經驗豐…

Jetson-AGX-Orin多網卡綁定網卡名

Jetson-AGX-Orin多網卡綁定網卡名 ? Jetson-AGX-Orin當通過USB接口或者Type-C口插入網卡設備后&#xff0c;重新上電Orin設備后&#xff0c;網卡設備的網卡名與Orin本身的以太網網卡名會發生交換。導致兩個網卡設備配置發生錯亂&#xff0c;兩個網卡都將不通。 可以通過將網…

出道即包攬多項榮譽,Shokz韶音OpenFit Air拿下日本VGP金獎

說到盛夏的日本&#xff0c;你會想到什么&#xff1f;花火大會&#xff1f;但對于消費電子行業來講&#xff0c;日本每年發布的VGP Summer獎項&#xff0c;才是每年盛夏時節行業內最大的慶典。而在今年的VGP 2024 Summer評選中&#xff0c;Shokz韶音在今年4月份剛發布的開放式耳…

開放式耳機音質哪個品牌的好?盤點幾款音質好品牌

在音樂的世界里&#xff0c;每一分貝的振動都承載著情感與故事。對于追求極致音質體驗的我們來說&#xff0c;耳機不僅是聆聽的工具&#xff0c;更是通往音樂靈魂深處的橋梁。而開放式耳機&#xff0c;以其獨有的聲學構造和聽覺享受&#xff0c;引領我們進入一個更為開闊的音樂…

ChatGPT 5.0:一年后的猜想

對于ChatGPT 5.0在未來一年半后的展望與看法&#xff0c;我們可以從以下幾個方面進行詳細探討&#xff1a; 一、技術提升與功能拓展 語言翻譯能力&#xff1a; ChatGPT 5.0在語言翻譯方面有望實現更大突破。據推測&#xff0c;新版本將利用更先進的自然語言處理技術和深度學習…

ONNX加載模型問題總結

輸入參數類型問題 run函數的參數列表如下&#xff1a; SessionImpl::Run(const Ort::RunOptions&, const char* const*, const Ort::Value*, size_t, const char* const*, Ort::Value*, size_t) 注意需要輸入輸出的參數名字形式是const char* const* 方式1 const char* 數…

vue中,圖片在div中按照圖片原來大小等比例顯示

圖片在div中按照圖片原來大小等比例顯示&#xff0c;可以保證web上顯示的圖片和實際圖片形狀一樣&#xff0c;保留原始圖片效果 實現代碼如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

如何探索高效知識管理:FlowUs知識庫體驗很好

在當今信息爆炸的時代&#xff0c;有效的知識管理對于個人和團隊的發展至關重要。FlowUs 知識庫作為一款創新的知識管理工具&#xff0c;正逐漸成為眾多用戶的首選&#xff0c;為他們帶來了高效、便捷和有條理的知識管理體驗。 FlowUs 知識庫的一大特色在于其簡潔直觀的界面設計…

【ai_agent】從零寫一個agent框架(五)基于egui制作一個agent/workflow在線編輯器

前言 上篇我們實現了基礎節點&#xff0c;并暴露出grpc服務&#xff0c;但是手動編輯文本制作一個workflow實在強人所難。 所以本文我們做個webui自動生成workflow。 開搞之前先看看別人怎么做的。 Dify 的ui 效果如下圖示&#xff1a; 支持多種功能節點 但只能打開一個節…

【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701

在window上運行spark程序寫到本地文件的時候報錯。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()錯誤信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…

如何在電子文件上加蓋印章

在電子文件上加蓋印章&#xff0c;可以通過多種方法實現&#xff0c;主要包括使用專業軟件、在線工具以及圖片編輯軟件等。以下是一些具體步驟和方法&#xff1a; 一、使用專業軟件 PDF編輯工具&#xff1a; 啟動常用的PDF編輯軟件&#xff0c;如Adobe Acrobat、PhantomPDF等…

紅日靶場----(三)漏洞利用

上期已經信息收集階段已經完成&#xff0c;接下來是漏洞利用。 靶場思路 通過信息收集得到兩個吧靶場的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;數據庫的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

阿里云通義千問開源兩款語音基座模型分別是SenseVoice和CosyVoice

阿里巴巴近期發布了開源語音大模型項目FunAudioLLM&#xff0c;該項目包含了兩個核心模型&#xff1a;SenseVoice和CosyVoice。可以精準多語言識別并且進行語音克隆。 SenseVoice&#xff1a;精準多語言識別與情感辨識 SenseVoice主要致力于高精度多語言語音識別、情感辨識和…