1. 程式人生 > >圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)--解析

圖的深度優先遍歷(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 //#