1. 程式人生 > >【圖】BFS和DFS

【圖】BFS和DFS

一、BFS

#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;
}
二、DFS
#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;
}

相關推薦

BFSDFS

一、BFS #include<iostream> #include<queue> using namespace std; const int max_num = 100; class BFS{ public: typedef int Vert

資料結構與演算法自己動手實現BFSDFS(附完整原始碼)

圖的儲存結構    本文的重點在於圖的深度優先搜尋(DFS)和廣度優先搜尋(BFS),因此不再對圖的基本概念做過多的介紹,但是要先大致瞭解下圖的幾種常見的儲存結構。    鄰接矩陣    鄰接矩陣既可以用來儲存無向圖,也可以用來儲存有向圖。該結構實際上就是用一個二維陣列(鄰接

BFSDFS原理及例項分析(java)

BFS和DFS是圖的兩種遍歷方式,是最簡單的圖搜尋演算法。 本文將給出給出BFS和DFS的以下幾種實現方式: 1、使用佇列Queue實現圖的BFS遍歷 2、遞迴實現圖的DFS遍歷 3、使用棧Stack迭代實現圖的DFS遍歷 一、BFS(廣度優先搜尋

基於鄰接矩陣鄰接表的兩種方法實現無向BFSDFS

        廣度優先搜尋(Breadth-First-Search)和深度優先搜尋(Deep-First-Search)是搜尋策略中最經常用到的兩種方法,特別常用於圖的搜尋. BFS的思想:       從一個圖的某一個頂點V0出發,首先訪問和V0相鄰的且未被訪問過的

BFSDFS之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次加入隊列中,那麽說明這個圖存在

的遍歷:BFSDFS

前言 圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(V)表示,而物件之間的關係或者關聯則通過圖的邊(E)來表示。 圖可以分為有向圖和無向圖,一般用G=(V,E)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中,最初需要

每日一題——的遍歷(BFS DFS

題目描述 從鍵盤接收有向圖的頂點集,弧集,建立有向圖,並完成下列任務: (1)計算結點的出度、入度以及度; (2) 從第一個頂點出發,求一個深度優先遍歷序列; (3) 從第一個頂點頂點出發,求一個廣度優先遍歷序列。 注意:以使用者輸入各個頂點

經典演算法:BFSDFS

寫在最前的三點: 1、所謂圖的遍歷就是按照某種次序訪問圖的每一頂點一次僅且一次。 2、實現bfs和dfs都需要解決的一個問題就是如何儲存圖。一般有兩種方法:鄰接矩陣和鄰接表。這裡為簡單起 見,均採用鄰接矩陣儲存,說白了也就是二維陣列。 3、本文章的小測試部分的測試例項

彙編堆疊畫堆疊

        根據咱們學彙編的經驗呀,彙編用的最多的是暫存器和記憶體之間的不斷相互傳值傳地址,井然有序。        然而,你知道它們具體是怎麼進行資料傳遞和交換的嗎?                                                  

的基本演算法(BFSDFS

圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(V)表示,而物件之間的關係或者關聯則通過圖的邊(E)來表示。 圖可以分為有向圖和無向圖,一般用G=(V,E)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中

模板題拓撲排序 兩道例題,兩種思路:貪心策略及DFS

題目大意:給出一堆關係類似"A<B",有三種結果:1)在第k個關係讀入後出現環路,2)在第k個關係讀入後能夠確定排序,3)無法確定順序。 注意: 1、出現結果1、2之後之後的s要讀但是操作略過 2、要判斷重複的邊(入度不能重複加) 3、要先判斷環路再判斷是否有多

javaTCPUDP傳輸協議

有序 equal sig [] link 客戶端 數據傳輸 端口 sock TCP協議和UDP協議的比較 TCP的全稱是Transmission Control Protocol (傳輸控制協議) 傳輸控制協議,是一種面向連接的協議,類似打電話 在通信的整個過程中

Spring-Security1認證授權

部分 完整 業務 代碼 參數 web 用戶訪問 設置 管理權限 【認證】 憑據為基礎的認證: 當你登錄 e-mail 賬號時,你可能提供你的用戶名和密碼。E-mail的提供商會將你的用戶名與數據中的記錄進行匹配,並驗證你提供的密碼與對應的記錄是不是匹配。這些憑證(用戶名和

NettyChannelHandlercodec

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可以自己控制隊列的長度。深度優先一般是解決連通性問題,而廣度優先一般是解決最短路

Javascriptcall aplly

方法的參數 call ava apply 調用 javascrip bsp 方法 rip apply和call是Function類型的原型函數。所有的函數都會自動繼承這兩個方法。 func.apply(thisArg, [argsArray])func.call(thisA

轉載shardingpartition區別

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

httppostget請求的區別

方式 無限制 信息 資源 敏感信息 字符 瀏覽器歷史記錄 指定 較差 兩種常用的HTTP請求方式:post和get get:從指定的資源進行請求。數據長度有限制(2048個字符)可被緩存、可被保留在瀏覽器歷史記錄中,安全性較差。發送敏感信息如密碼時不適用。 post

筆記payloadformData

分組 ping multipart code sha con cati https www. formData是客戶端主體部分組裝數據的一種方式,當我們使用: method=‘POST‘提交一個HTML-Form表單 content-Type:application/x-