【圖】BFS和DFS
一、BFS
二、DFS#include<iostream> #include<queue> using namespace std; const int max_num = 100; class BFS{ public: typedef int VertexType; typedef int EdgeType; BFS(); void create_graph(); void bfs_traverse(); private: EdgeType arc[max_num][max_num]; bool visited[max_num]; queue<EdgeType> que; //輔助佇列 int vertex_num; int edge_num; }; BFS::BFS(){ for (int i = 0; i < max_num; i++){ for (int j = 0; j < max_num; j++){ arc[i][j] = 0; } } memset(visited, false, sizeof(visited)); while (!que.empty()) que.pop(); } void BFS::create_graph(){ int i, j, k; cout << "請輸入圖的頂點數和邊數:" << endl; cin >> vertex_num >> edge_num; for (i = 0; i < edge_num; i++){ cout << "輸入邊(vj,vk)上的上標j,下標k" << endl; cin >> j >> k; arc[j][k] = arc[k][j] = 1; } } void BFS::bfs_traverse(){ for (int i = 0; i < vertex_num; i++){ if (!visited[i]){ visited[i] = true; cout << i << " "; que.push(i); while (!que.empty()){ int k = que.front(); que.pop(); for (int j = 0; j < vertex_num; j++){ if (arc[k][j] == 1 && !visited[j]){ visited[j] = true; cout << j << " "; que.push(j); } } } } } } int main(){ BFS bfs; bfs.create_graph(); bfs.bfs_traverse(); return 0; }
#include<iostream> using namespace std; const int max_num = 100; class DFS{ public: typedef int VertexType; typedef int EdgeType; DFS(); void create_graph(); void dfs(int i); void dfs_traverse(); private: EdgeType arc[max_num][max_num]; bool visited[max_num]; int vertex_num; int edge_num; }; DFS::DFS(){ for (int i = 0; i < max_num; i++){ for (int j = 0; j < max_num; j++){ arc[i][j] = 0; } } memset(visited, false, sizeof(visited)); } void DFS::create_graph(){ int i, j, k; cout << "請輸入圖的頂點數和邊數:" << endl; cin >> vertex_num >> edge_num; for (i = 0; i < edge_num; i++){ cout << "輸入邊(vj,vk)上的上標j,下標k" << endl; cin >> j >> k; arc[j][k] = arc[k][j] = 1; } } void DFS::dfs(int i){ visited[i] = true; cout << i << " "; for (int j = 0; j < vertex_num; j++){ if (arc[i][j] == 1 && !visited[j]) dfs(j); //對未訪問的鄰接頂點遞迴呼叫 } } void DFS::dfs_traverse(){ for (int i = 0; i < vertex_num; i++){ if (!visited[i]) dfs(i); } } int main(){ DFS dfs; dfs.create_graph(); dfs.dfs_traverse(); return 0; }
相關推薦
【圖】BFS和DFS
一、BFS #include<iostream> #include<queue> using namespace std; const int max_num = 100; class BFS{ public: typedef int Vert
【資料結構與演算法】自己動手實現圖的BFS和DFS(附完整原始碼)
圖的儲存結構 本文的重點在於圖的深度優先搜尋(DFS)和廣度優先搜尋(BFS),因此不再對圖的基本概念做過多的介紹,但是要先大致瞭解下圖的幾種常見的儲存結構。 鄰接矩陣 鄰接矩陣既可以用來儲存無向圖,也可以用來儲存有向圖。該結構實際上就是用一個二維陣列(鄰接
圖的BFS和DFS原理及例項分析(java)
BFS和DFS是圖的兩種遍歷方式,是最簡單的圖搜尋演算法。 本文將給出給出BFS和DFS的以下幾種實現方式: 1、使用佇列Queue實現圖的BFS遍歷 2、遞迴實現圖的DFS遍歷 3、使用棧Stack迭代實現圖的DFS遍歷 一、BFS(廣度優先搜尋
基於鄰接矩陣和鄰接表的兩種方法實現無向圖的BFS和DFS
廣度優先搜尋(Breadth-First-Search)和深度優先搜尋(Deep-First-Search)是搜尋策略中最經常用到的兩種方法,特別常用於圖的搜尋. BFS的思想: 從一個圖的某一個頂點V0出發,首先訪問和V0相鄰的且未被訪問過的
圖的BFS和DFS之C++實現
圖的建立 手動輸入,並以節點數作為輸入結束標誌 從檔案讀取,檔案的從第二行開始,每一行結束都要有節點數作為結束 圖的儲存: vector< list<int> > graph; 圖的BFS 非遞迴實現,藉助佇列 v
洛谷P3385 【模板】負環 DFS-SPFA 判負環 圖論
string inf scan space can 清空 span %d pre 洛谷P3385 【模板】負環 圖論 今天get了 一個 DFS-SPFA 判負環的方法 一般的 BFS-SPFA 判負環 一般就是 不停地做,如果某點第 n+1次加入隊列中,那麽說明這個圖存在
圖的遍歷:BFS和DFS
前言 圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(V)表示,而物件之間的關係或者關聯則通過圖的邊(E)來表示。 圖可以分為有向圖和無向圖,一般用G=(V,E)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中,最初需要
每日一題——圖的遍歷(BFS 和DFS)
題目描述 從鍵盤接收有向圖的頂點集,弧集,建立有向圖,並完成下列任務: (1)計算結點的出度、入度以及度; (2) 從第一個頂點出發,求一個深度優先遍歷序列; (3) 從第一個頂點頂點出發,求一個廣度優先遍歷序列。 注意:以使用者輸入各個頂點
【經典演算法】:BFS與DFS
寫在最前的三點: 1、所謂圖的遍歷就是按照某種次序訪問圖的每一頂點一次僅且一次。 2、實現bfs和dfs都需要解決的一個問題就是如何儲存圖。一般有兩種方法:鄰接矩陣和鄰接表。這裡為簡單起 見,均採用鄰接矩陣儲存,說白了也就是二維陣列。 3、本文章的小測試部分的測試例項
【彙編】堆疊和畫堆疊圖
根據咱們學彙編的經驗呀,彙編用的最多的是暫存器和記憶體之間的不斷相互傳值傳地址,井然有序。 然而,你知道它們具體是怎麼進行資料傳遞和交換的嗎?
圖的基本演算法(BFS和DFS)
圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(V)表示,而物件之間的關係或者關聯則通過圖的邊(E)來表示。 圖可以分為有向圖和無向圖,一般用G=(V,E)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中
【模板題】【圖】拓撲排序 兩道例題,兩種思路:貪心策略及DFS
題目大意:給出一堆關係類似"A<B",有三種結果:1)在第k個關係讀入後出現環路,2)在第k個關係讀入後能夠確定排序,3)無法確定順序。 注意: 1、出現結果1、2之後之後的s要讀但是操作略過 2、要判斷重複的邊(入度不能重複加) 3、要先判斷環路再判斷是否有多
【java】TCP和UDP傳輸協議
有序 equal sig [] link 客戶端 數據傳輸 端口 sock TCP協議和UDP協議的比較 TCP的全稱是Transmission Control Protocol (傳輸控制協議) 傳輸控制協議,是一種面向連接的協議,類似打電話 在通信的整個過程中
【Spring-Security】【1】認證和授權
部分 完整 業務 代碼 參數 web 用戶訪問 設置 管理權限 【認證】 憑據為基礎的認證: 當你登錄 e-mail 賬號時,你可能提供你的用戶名和密碼。E-mail的提供商會將你的用戶名與數據中的記錄進行匹配,並驗證你提供的密碼與對應的記錄是不是匹配。這些憑證(用戶名和
【Netty】ChannelHandler和codec
creat int simple exception 代碼 大型 and sed log 一、前言 前面學習了Netty的codec框架,下面接著學習ChannelHandler與codec之間的關聯。 二、ChannelHandler和codec Netty
BFS 和 DFS
status pos preorder 速度 算法 遍歷 white postorder 深度優先 BFS and DFS 一般來說,能用DFS解決的問題,都能用BFS。DFS容易爆棧,而BFS可以自己控制隊列的長度。深度優先一般是解決連通性問題,而廣度優先一般是解決最短路
【Javascript】call 和aplly
方法的參數 call ava apply 調用 javascrip bsp 方法 rip apply和call是Function類型的原型函數。所有的函數都會自動繼承這兩個方法。 func.apply(thisArg, [argsArray])func.call(thisA
【轉載】sharding和partition區別
spl break iss sys div ica dividing shard ati Partitioning is a general term used to describe the act of breaking up your logical dat
【http】post和get請求的區別
方式 無限制 信息 資源 敏感信息 字符 瀏覽器歷史記錄 指定 較差 兩種常用的HTTP請求方式:post和get get:從指定的資源進行請求。數據長度有限制(2048個字符)可被緩存、可被保留在瀏覽器歷史記錄中,安全性較差。發送敏感信息如密碼時不適用。 post
【筆記】payload和formData
分組 ping multipart code sha con cati https www. formData是客戶端主體部分組裝數據的一種方式,當我們使用: method=‘POST‘提交一個HTML-Form表單 content-Type:application/x-