PTA 7-6 列出連通集

題目詳情:

給定一個有 n 個頂點和 m 條邊的無向圖,請用深度優先遍歷(DFS)和廣度優先遍歷(BFS)分別列出其所有的連通集。假設頂點從 0 到 n?1 編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:

輸入第 1 行給出 2 個整數 n (0<n≤10) 和 m,分別是圖的頂點數和邊數。隨后 m 行,每行給出一條邊的兩個端點。每行中的數字之間用 1 空格分隔。

輸出格式:

按照"{ v1? v2? ... vk? }"的格式,每行輸出一個連通集。先輸出 DFS 的結果,再輸出 BFS 的結果。

輸入樣例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

輸出樣例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }

題目解析?

? 逐步分析

? 首先,圖的表示方式。頂點數n不超過10,可以用鄰接表或者鄰接矩陣。因為需要按編號遞增的順序訪問鄰接點,所以鄰接表里的每個頂點的鄰接點應該按升序排列。或者,在每次訪問鄰接點的時候,按從小到大的順序遍歷。例如,對于鄰接矩陣來說,每個頂點x的所有鄰接點,可以按頂點編號從小到大遍歷,即從0到n-1依次檢查是否有邊相連。

? 或者,鄰接表的話,每個頂點的鄰接點列表需要排序。例如,每次添加邊的時候,把鄰接點插入到正確的位置,保持列表的升序。或者,在生成鄰接表之后,對每個頂點的鄰接點列表進行排序。這一步很重要,因為DFS和BFS的遍歷順序必須按照鄰接點的編號遞增的順序進行訪問。所以,圖的存儲結構可能需要鄰接表或者鄰接矩陣,同時要保證遍歷鄰接點的順序是遞增的。

? 例如,鄰接矩陣的話,對于每個頂點,遍歷時檢查所有頂點,按照編號順序依次訪問是否有邊相連。這可能比較方便,特別是當頂點數目較小的時候(n<=10)。這樣,在處理每個頂點的時候,只需要從0到n-1遍歷,檢查是否相連,并且是否未被訪問過。這樣就能保證按照編號遞增的順序訪問鄰接點。

? 那鄰接矩陣可能更適合這個題目,因為處理順序容易控制。比如,假設用鄰接矩陣存儲,那么每個頂點x的鄰接點就是所有y滿足matrix[x][y]為true,并且y按照從小到大排列。所以在遍歷的時候,只需要從0到n-1循環,判斷是否是鄰接點,并且是否已訪問過。

??所以,鄰接矩陣可能更簡單。

? 整個流程應該是這樣的:對于DFS和BFS各需要處理一次:初始化訪問數組,所有頂點未被訪問。然后,按照頂點編號從小到大(從0到n-1)的順序,逐個檢查頂點是否被訪問。如果未被訪問,則從該頂點開始進行DFS或BFS,并將訪問到的頂點記錄下來,形成一個連通集。這樣就能保證每個連通分量都是從其中最小的頂點開始遍歷,并且在遍歷過程中,鄰接點按照編號遞增的順序被訪問。

? 大致步驟如下:

? ? ? 1. 讀取輸入n和m。

? ? ? 2. 構建鄰接矩陣。初始化n×n的二維數組,初始為false。然后讀取m條邊,將對應的兩個頂點之間的邊設為true。

? ? ? 3. 進行DFS遍歷:

? ? ? ? ? ? ? a. 初始化一個訪問數組visited,所有元素初始為false。

? ? ? ? ? ? ? b. 按照頂點編號從小到大遍歷每個頂點i:

? ? ? ? ? ? ? ? ? ? ?i. 如果未被訪問,則開始DFS遍歷,并將結果記錄為一個連通集。

? ? ? ? ? ? ? ? ? ? ii. 在DFS過程中,將訪問的頂點按順序保存,并在結束后輸出。

? ? ? 4. 進行BFS遍歷,同樣的邏輯,但使用隊列。

? 推薦代碼

??

#include <iostream>
#include <vector>
#include <queue>
using namespace std;void DFS(int v, vector<bool>& visited, const vector<vector<bool>>& adj, vector<int>& component) {visited[v] = true;component.push_back(v);for (int i = 0; i < adj.size(); ++i) {if (adj[v][i] && !visited[i]) {DFS(i, visited, adj, component);}}
}void BFS(int v, vector<bool>& visited, const vector<vector<bool>>& adj, vector<int>& component) {queue<int> q;q.push(v);visited[v] = true;component.push_back(v);while (!q.empty()) {int current = q.front();q.pop();for (int i = 0; i < adj.size(); ++i) {if (adj[current][i] && !visited[i]) {visited[i] = true;component.push_back(i);q.push(i);}}}
}int main() {int n, m;cin >> n >> m;vector<vector<bool>> adj(n, vector<bool>(n, false));for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;adj[u][v] = true;adj[v][u] = true;}// DFSvector<bool> visited(n, false);for (int i = 0; i < n; ++i) {if (!visited[i]) {vector<int> component;DFS(i, visited, adj, component);cout << "{ ";for (int v : component) {cout << v << " ";}cout << "}" << endl;}}// BFSvisited.assign(n, false);for (int i = 0; i < n; ++i) {if (!visited[i]) {vector<int> component;BFS(i, visited, adj, component);cout << "{ ";for (int v : component) {cout << v << " ";}cout << "}" << endl;}}return 0;
}

自我實現代碼?

??

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>using namespace std;int n,m;
int g[15][15];
int vis[15];
vector<int>res;
queue<int>q;void dfs(int x)
{res.push_back(x);vis[x]=1;for(int i=1;i<=n;++i){if(g[x][i]==1&&!vis[i]){vis[i]=1;dfs(i);}}
}void bfs(int x)
{res.push_back(x);q.push(x);vis[x]=1;while(!q.empty()){int xx=q.front();q.pop();for(int i=1;i<=n;++i){if(g[xx][i]==1&&!vis[i]){res.push_back(i);vis[i]=1;q.push(i);}}}}int main()
{cin>>n>>m;int a,b;for(int i=1;i<=m;++i){cin>>a>>b;g[a+1][b+1]=1;g[b+1][a+1]=1;	}for(int i=1;i<=n;++i){if(!vis[i]){res.clear();dfs(i);cout<<"{";for(int i=0;i<res.size();++i){cout<<" "<<res[i]-1;}cout<<" }"<<endl;}}memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i){if(!vis[i]){while(!q.empty())q.pop();res.clear();bfs(i);cout<<"{";for(int i=0;i<res.size();++i){cout<<" "<<res[i]-1;}cout<<" }"<<endl;}}return 0;
}

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

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

相關文章

ES中數據刷新策略refresh

在 Elasticsearch 中&#xff0c;插入數據時的 refresh 參數控制文檔在寫入后何時對搜索可見&#xff0c;其行為直接影響數據可見性和系統性能。以下是 refresh 參數的三個可選值&#xff08;true、false、wait_for&#xff09;的詳細說明及適用場景&#xff1a; 1. refreshtr…

用Python的Pandas庫解鎖數據科學:從入門到實戰

用Python的Pandas庫解鎖數據科學&#xff1a;從入門到實戰 引言 Python的Pandas庫&#xff08;名稱源自"Panel Data"&#xff09;作為數據科學生態系統的基石&#xff0c;憑借其強大的數據結構和靈活的操作功能&#xff0c;已成為全球超過90%數據工作者的首選工具。…

如何提高域名解析速度?

在搭建網站或使用在線服務時&#xff0c;許多人會問&#xff1a;“為什么我的網站加載速度這么慢?”“如何提高域名解析速度?”“域名解析速度對網站性能有什么影響?”域名解析速度直接影響用戶訪問網站的體驗&#xff0c;因此&#xff0c;了解如何提高域名解析速度尤為重要…

深度學習語義分割數據集全景解析

一、語義分割任務概述 語義分割是計算機視覺領域的核心任務之一&#xff0c;目標是通過算法將圖像中的每個像素精準劃分到對應的語義類別&#xff08;如道路、車輛、行人等&#xff09;。高質量標注數據集是推動該領域發展的關鍵因素。本文將系統梳理主流數據集的技術特征與適…

貪心算法一

> 作者&#xff1a;?舊言~ > 座右銘&#xff1a;松樹千年終是朽&#xff0c;槿花一日自為榮。 > 目標&#xff1a;了解什么是貪心算法&#xff0c;并且掌握貪心算法。 > 毒雞湯&#xff1a;有些事情&#xff0c;總是不明白&#xff0c;所以我不會堅持。早安! >…

基于websocket的多用戶網頁五子棋 --- 測試報告

目錄 功能測試自動化測試性能測試 功能測試 1.登錄注冊頁面 2.游戲大廳頁面 3.游戲房間頁面 自動化測試 1.使用腦圖編寫web自動化測試用例 2.創建自動化項目&#xff0c;根據用例通過selenium來實現腳本 根據腦圖進行測試用例的編寫&#xff1a; 每個頁面一個測試類&am…

docker學習與使用

一、docker概述 1.docker是什么 是一個開源的應用容器引擎&#xff0c;基于go語言開發并遵循apache2.0協議開源 是在Linux容器里運行應用的開源工具 是一種輕量級的 “虛擬機” Docker的容器技術,可以在一臺主機上輕松為任何應用創建一個輕量級的、可移植的、自給自足的容器…

2025-03-04 學習記錄--C/C++-C語言 判斷是否是素數

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C語言 判斷是否是素數 一、代碼 ?? #include <stdio.h> #include <stdbool.h> // 使用 bool 類型// 判斷是否是…

如何將飛書多維表格與DeepSeek R1結合使用:效率提升的完美搭檔

將飛書的多維表格與DeepSeek R1結合使用&#xff0c;就像為你的數據管理和分析之旅裝上一臺渦輪增壓器。兩者的合作&#xff0c;不僅僅在速度上讓人耳目一新&#xff0c;更是將智能化分析帶入了日常的工作場景。以下是它們如何相輔相成并改變我們工作方式的一些分享。 --- 在…

離散傅里葉變換(Discrete Fourier Transform, DFT)及其在圖像處理中的應用

離散傅里葉變換&#xff08;DFT&#xff09;及其在圖像處理中的應用 什么是離散傅里葉變換&#xff1f; 離散傅里葉變換&#xff08;Discrete Fourier Transform, DFT&#xff09;是一種強大的數學工具&#xff0c;用于將離散信號從時域&#xff08;或空間域&#xff09;轉換…

在 macOS 上使用 CLion 進行 Google Test 單元測試

介紹 Google Test&#xff08;GTest&#xff09;是 Google 開源的 C 單元測試框架&#xff0c;它提供了簡單易用的斷言、測試夾具&#xff08;Fixtures&#xff09;和測試運行機制&#xff0c;使 C 開發者能夠編寫高效的單元測試。 本博客將介紹如何在 macOS 上使用 CLion 配…

Oracle SQL優化實戰要點解析(11)——索引、相關子查詢及NL操作(1)

11.1. 充分利用索引有序特性,避免發生大表上的FTS,以及對中間大數據集的排序。 11.1.1. 適用場景 從一個或多個大表(例如:億行級或TB級數據量)中過濾出全列大數據集(例如:數百萬或千萬行數據),對該大數據集按其中某列進行排序,最終,只取最前面的少部分數據(例如:…

軟考架構師筆記-計算機網絡

1.9 計算機網絡 OSI/RM 七層模型 物理層 二進制傳輸(中繼器、集線器) (typedef) 數據鏈路層 傳送以幀為單位的信息(網橋、交換機、網卡) 網絡層 分組傳輸和路由選擇(三層交換機、路由器)ARP/RARP/IGMP/ICMP/IP 傳輸層 端到端的連接(TCP/UDP)在前向糾錯系統中&#xff0c;當接…

STM32MP157A單片機移植Linux系統使用python鏈接云服務器

思維導圖 需求分析 stm32mp157a單片機上移植Linux操作系統&#xff0c;包括LCD驅動、觸摸驅動、Ethernet/WiFi支持&#xff0c;設備樹信息包括ADC、GPIO、LCD&#xff0c;使用QT上位機在PC端顯示&#xff0c;通過TCP與stm32交互&#xff0c;將ad數據傳輸到PC端和云服務器&…

【MySQL】Can‘t connect to server in ‘localhost‘

【問題】連接MySQL數據庫時報錯&#xff1a; 【原因】沒有啟動MySQL服務 【解決方法】&#x1f447;&#x1f447;&#x1f447; 1.以管理員身份運行PowerShell 2.執行命令&#xff1a;net start MySQL 提示 “MySQL服務已經啟動成功” 就說明成功了&#xff0c;這時再連…

OceanBase-obcp-v3考試資料梳理

集群架構 基本概念 集群: 集群由一個或多個Region組成,Region 由一個或多個Zone組成,Zone由一個或多個OBServer組成,每個OBServer里有若干個partition的Replica。 Region: 對應物理上的一個城市或地域,當OB集群由多個Region組成時, 數據庫的數據和服務能力就具備地域…

Vue 系列之:組件通訊

子組件調用父組件方法 1、直接在子組件中通過 this.$parent.event 來調用父組件的方法 父組件&#xff1a; <template><p><child></child></p> </template> <script>import child from ./child;export default {components: {chi…

ComfyUI簡介

一、ComfyUI 是什么&#xff1f; ComfyUI 是一款基于節點的圖形用戶界面&#xff08;GUI&#xff09;&#xff0c;專為 Stable Diffusion 設計。它通過模塊化節點連接的方式構建復雜的圖像生成工作流&#xff0c;用戶可自由組合加載模型、輸入提示詞、調整采樣器等操作模塊&am…

我的兩個醫學數據分析技術思路

我的兩個醫學數據分析技術思路 從臨床上獲得的或者公共數據庫數據這種屬于觀察性研究&#xff0c;是對臨床診療過程中自然產生的數據進行分析而獲得疾病發生發展的規律等研究成果。再細分&#xff0c;可以分為獨立危險因素鑒定和預測模型構建兩種。 獨立危險因素鑒定是一直以…

【YOLOv12改進trick】StarBlock引入YOLOv12,創新漲點優化,含創新點Python代碼,方便發論文

??改進模塊??:StarBlock ??解決問題??:采用StarBlock將輸入數據映射到一個極高維的非線性特征空間,生成豐富的特征表示,使得模型在處理復雜數據時更加有效。 ??改進優勢??:簡單粗暴的星型乘法漲點卻很明顯 ??適用場景??:目標檢測、語義分割、自然語言處理…