圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)--解析
圖的資料結構不像二叉樹那樣,有明顯的父子節點和兄弟節點的關係,它只有一個關係就是鄰接關係。故對圖中頂點的訪問要採用標誌陣列(來確定改結點是否被訪問,去除重複訪問)。並且對圖的深度遍歷採用遞迴的方式是較高效的。
1.深度遍歷(DFS)
#include<iostream> #include<stdlib.h> using namespace std; //DFS #define MAX 10 bool visited[MAX]; status (*VisitFunc)(int v);//定義函式指標 void DFS(Graph G,int v) { visited[v]=TRUE;VisitFunc(v); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) if(!visited[w]) DFS(G,w);//與樹的DFS的區別 } void DFSt(Graph G,status(*Visit)(int v)) { VisitFunc = Visit;//為函式指標賦值 for(v=0;v<G.vexnum;++v) visited[v]=FALSE;//初始化標誌陣列 //memset(visited,0,sizeof(visited)); for(v=0;v<G.vexnum;++v) if(!visited[v])DFS(G,v); }
2.廣度遍歷(BFS)
廣度優先遍歷利用輔助佇列後,很好的達到了遍歷的效果。
#include<iostream> #include<stdlib.h> using namespace std; //BFS #define MAX 10 bool visited[MAX]; status (*VisitFunc)(int v);//定義函式指標 void BSF(Graph G,Status(* Visit)(int v)) { for(v=0;v<G.vexnum;++v) visited[v]=FALSE; InitQueue(Q); for(v=0;v<G.vexnum;++v) { if(!visited[v]) { visited[v]=TRUE;Visit(v); EnQueue(Q,v); while(!QueueEmpty(Q)) { DeQueue(Q,u); for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) { if(!Visited[w]) { Visited[w]=TRUE;Visit(w); EnQueue(Q,w);//把節點的所有鄰接節點都入隊,並且都遍歷一次 } } } } } }
3.總結
對於圖結構,若採用鄰接表儲存的話,FirstAdjVex和NextAdjVex是很好得到的
相關推薦
圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)
1 建立測試圖(鄰接矩陣和鄰接表儲存形式) 首先建立一個圖用於後續程式碼的測試,在此以無向圖為例,且所有邊的權值都為1。儲存方式分別為鄰接矩陣和鄰接表(見上一篇介紹) 鄰接矩陣: class Graph{ constructor(v,vr){ let len = v.le
圖 | 兩種遍歷方式:深度優先搜尋(DFS、深搜)和廣度優先搜尋(BFS、廣搜)
前邊介紹了有關圖的 4 種儲存方式,本節介紹如何對儲存的圖中的頂點進行遍歷。常用的遍歷方式有兩種:深度優先搜尋和廣度優先搜尋。 深度優先搜尋(簡稱“深搜”或DFS) 圖 1 無向圖 深度優先搜尋的過程類似於樹的先序遍歷,首先從例
圖的遍歷演算法-深度優先搜尋演算法(dfs)和廣度優先搜尋演算法(bfs)
一、前提須知圖是一種資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件:頂點(V)表示;物件之間的關係或者關聯:通過圖的邊(E)來表示。一般oj題中可能就是點與點,也有可能是具體生活中的物體圖
圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)--解析
圖的資料結構不像二叉樹那樣,有明顯的父子節點和兄弟節點的關係,它只有一個關係就是鄰接關係。故對圖中頂點的訪問要採用標誌陣列(來確定改結點是否被訪問,去除重複訪問)。並且對圖的深度遍歷採用遞迴的方式是較高效的。 1.深度遍歷(DFS) #include<iostream
PHP實現二叉樹的深度優先遍歷(前序、中序、後序)和廣度優先遍歷(層次)
前言: 深度優先遍歷:對每一個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。要特別注意的是,二叉樹的深度優先遍歷比較特殊,可以細分為先序遍歷、中序遍歷、後序遍歷。具體說明如下: 前序遍歷:根節點->左子樹->右子樹 中序遍歷:左子樹->根節點->右子樹 後
圖的深度優先搜尋(DFS)和廣度優先搜尋(BFS)及其Java實現
一、背景知識:(1)圖的表示方法:鄰接矩陣(二維陣列)、鄰接表(連結串列陣列【連結串列的連結串列】)。(2)圖的搜尋方法:深度優先搜尋(DFS)和廣度優先搜尋(BFS)。二、圖的搜尋: 1、深度優先搜尋(DFS): (1)用棧記錄下一步的走向。訪問一
python 用棧和佇列實現二叉樹的深度優先遍歷(三種)和廣度優先遍歷
#coding=utf-8 #自定義佇列 class pyqueue(): def __init__(self, size): self.queue = [] self.size = size self.end =
二叉樹的深度優先遍歷(棧)和廣度優先遍歷(佇列)
前序,中序和後序遍歷都是深度優先遍歷的特例 :所以直接先序中序後續遍歷也可以 深度優先遍歷(棧,先壓右節點,再壓左節點) 也就深入的遍歷,沿著每一個分支直到走到最後,然後才返回來遍歷剩餘的節點。二叉樹不同於圖,圖需要標記節點是否已經訪問過,因為可能會存在環,而二叉樹不會
深度優先搜索(BFS)和廣度優先搜索( DFS)還有 迪傑斯特拉算法(dijkstra)
path pat info 退回 bsp 分享圖片 span 一個 sta 首先我們根據我隨意設定的一個路徑建立一個字典 path = { "A":{"B", "C"}, "B":{"A", "D", "E"}, "C":{"A",
圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)
概述 圖的遍歷是指從圖中的任一頂點出發,對圖中的所有頂點訪問一次且只訪問一次。圖的遍歷操作和樹的遍歷操作功能相似。圖的遍歷是圖的一種基本操作,圖的其它演算法如求解圖的連通性問題,拓撲排序,求關鍵路徑等都是建立在遍歷演算法的基礎之上。 由於圖結構本身
圖的遍歷(深度優先遍歷和廣度優先遍歷)
圖的遍歷就是從圖中某個頂點出發,按某種方法對圖中所有頂點訪問且僅訪問一次。 圖的遍歷演算法是求解圖的連通性問題、拓撲排序和求關鍵路徑等演算法的基礎 深度優先遍歷(depth-first search):類似於樹的先根遍歷,是樹的先根遍歷的推廣 (可以採用遞迴和藉助棧的非遞迴方式實現)
二叉樹的深度優先遍歷(DFS)與廣度優先遍歷(BFS)
最近在練習劍指offer上的題,討論區看到有人提到深度優先遍歷和廣度優先遍歷,就查了一點相關知識點。 深度優先遍歷(Depth First Search,簡稱DFS)又稱深度優先搜尋,遍歷的過程是 從某個頂點出發,首先訪問這個頂點,然後找出剛訪問這個結點的第一個未被訪問的鄰結點,然後
圖:深度優先遍歷和廣度優先遍歷(Java實現)
深度優先遍歷 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第一個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第一個鄰接結點。總結起來可以這樣說:每次都在訪問完當前結點後首先訪問當前結點的
1003:深度優先遍歷(DFS)&廣度優先遍歷(BFS)
Problem Description 設有一連通有向圖,其頂點值為字元型並假設各值互不相等,採用鄰接表表示法儲存表示,求其廣度優先遍歷序列。 Input 有多組測試資料,每組資料的第一行為兩個整數n和e,表示n個頂點和e條邊(0<n<20);第二行為其n個頂
無向圖的深度優先遍歷和廣度優先遍歷(鄰接連結串列)
我選的是鄰接連結串列,建立如下圖所示的圖: 我把它畫出來,圖是這樣子的: 對於深度優先遍歷:是從一個頂點v出發,一步一步地向前推進,當找不到未訪問過的頂點時,也是一步一步地回退。其過程類似於用棧求解迷宮問題的搜尋方式。 比如上面這個圖:我從4這個頂點開始遍歷,它
小朋友學資料結構(16):基於鄰接矩陣的的深度優先遍歷和廣度優先遍歷
觀察下面兩個無向圖: 這兩個圖其實是一樣的,只是畫法不同罷了。第一張圖更有立體感,第二張圖更有層次感,並且把A點置為頂點(事實上圖的任何一點都可以做為頂點)。 一、用陣列來存放頂點 vexs[0] = ‘A’ vexs[1] = ‘B’ vexs[2] = ‘C’ ve
二叉樹深度優先遍歷(遞迴、非遞迴)、廣度優先遍歷、構建二叉樹
public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public Tree
圖的深度優先和廣度優先演算法(DFS遞迴與非遞迴)
本部落格前面文章已對圖有過簡單的介紹,本文主要是重點介紹有關圖的一些具體操作與應用 無向圖——鄰接矩陣的深度優先和廣度優先演算法實現 測試環境:VS2008(C) #include "st
鄰接表實現--圖的深度優先遍歷DFS和廣度優先遍歷BFS
圖論中一個基本的概念就是遍歷。就是訪問到圖的每一個頂點,同時每個頂點只訪問一次。 DFS和BFS的概念和思路網上說明的很詳細了。但是網上很多程式碼實現有缺陷,基本都沒有考慮圖不連通的情況,比如某個頂點A和其它任何一個頂點都不關聯,
資料結構實驗圖論:基於鄰接矩陣/鄰接表的廣度優先搜尋遍歷(BFS)
//#include <iostream> //#include <stdlib.h> //#include <stdio.h> //#include <string.h> //#include <queue> //#define M 20 //#