圖之圖的深度優先遍歷
深度優先遍歷是連通圖的一種遍歷策略。其基本思想如下:
設x是當前被訪問頂點,在對x做過訪問標記後,選擇一條從x出發的未檢測過的邊(x,y)。若發現頂點y已訪問過,則重新選擇另一條從x出發的未檢測過的邊,否則沿邊(x,y)到達未曾訪問過的y,對y訪問並將其標記為已訪問過;然後從y開始搜尋,直到搜尋完從y出發的所有路徑,即訪問完所有從y出發可達的頂點之後,才回溯到頂點x,並且再選擇一條從x出發的未檢測過的邊。上述過程直至從x出發的所有邊都已檢測過為止。
例如下圖中:
#include <stdio.h> #include <malloc.h> #define VERTEXNUM 5 void createGraph(int (*edge)[VERTEXNUM], int start, int end); void displayGraph(int (*edge)[VERTEXNUM]); void DFT(int (*edge)[VERTEXNUM],int* vertexStatusArr); void DFTcore(int (*edge)[VERTEXNUM],int i,int* vertexStatusArr); int main(void){ //動態建立存放邊的二維陣列 int (*edge)[VERTEXNUM] = (int (*)[VERTEXNUM])malloc(sizeof(int)*VERTEXNUM*VERTEXNUM); int i,j; for(i=0;i<VERTEXNUM;i++){ for(j=0;j<VERTEXNUM;j++){ edge[i][j] = 0; } } //存放頂點的遍歷狀態,0:未遍歷,1:已遍歷 int* vertexStatusArr = (int*)malloc(sizeof(int)*VERTEXNUM); for(i=0;i<VERTEXNUM;i++){ vertexStatusArr[i] = 0; } printf("after init:\n"); displayGraph(edge); //建立圖 createGraph(edge,0,3); createGraph(edge,0,4); createGraph(edge,3,1); createGraph(edge,3,2); createGraph(edge,4,1); printf("after create:\n"); displayGraph(edge); //深度優先遍歷 DFT(edge,vertexStatusArr); free(edge); return 0; } //建立圖 void createGraph(int (*edge)[VERTEXNUM], int start, int end){ edge[start][end] = 1; } //列印儲存的圖 void displayGraph(int (*edge)[VERTEXNUM]){ int i,j; for(i=0;i<VERTEXNUM;i++){ for(j=0;j<VERTEXNUM;j++){ printf("%d ",edge[i][j]); } printf("\n"); } } //深度優先遍歷 void DFT(int (*edge)[VERTEXNUM], int* vertexStatusArr){ printf("start BFT graph:\n"); int i; for(i=0;i<VERTEXNUM;i++){ DFTcore(edge,i,vertexStatusArr); } printf("\n"); } void DFTcore(int (*edge)[VERTEXNUM],int i,int* vertexStatusArr){ if(vertexStatusArr[i] == 1){ return; } printf("%d ",i); vertexStatusArr[i] = 1; int j; for(j=0;j<VERTEXNUM;j++){ if(edge[i][j] == 1){ DFTcore(edge, j, vertexStatusArr); } } }
c語言實現如下:(使用鄰接表儲存)
#include <stdio.h> #include <malloc.h> #define VERTEXNUM 5 //存放頂點的鄰接表元素 typedef struct edge{ int vertex; struct edge* next; }st_edge; void createGraph(st_edge** edge, int start, int end); void displayGraph(st_edge** edge); void delGraph(st_edge** edge); void DFT(st_edge** edge,int* vertexStatusArr); void DFTcore(st_edge** edge,int i,int* vertexStatusArr); int main(void){ //動態建立存放邊的指標陣列 st_edge** edge = (st_edge**)malloc(sizeof(st_edge*)*VERTEXNUM); int i; for(i=0;i<VERTEXNUM;i++){ edge[i] = NULL; } //存放頂點的遍歷狀態,0:未遍歷,1:已遍歷 int* vertexStatusArr = (int*)malloc(sizeof(int)*VERTEXNUM); for(i=0;i<VERTEXNUM;i++){ vertexStatusArr[i] = 0; } printf("after init:\n"); displayGraph(edge); //建立圖 createGraph(edge,0,3); createGraph(edge,0,4); createGraph(edge,3,1); createGraph(edge,3,2); createGraph(edge,4,1); printf("after create:\n"); displayGraph(edge); //深度優先遍歷 DFT(edge,vertexStatusArr); //釋放鄰接表佔用的記憶體 delGraph(edge); edge = NULL; free(vertexStatusArr); vertexStatusArr = NULL; return 0; } //建立圖 void createGraph(st_edge** edge, int start, int end){ st_edge* newedge = (st_edge*)malloc(sizeof(st_edge)); newedge->vertex = end; newedge->next = NULL; edge = edge + start; while(*edge != NULL){ edge = &((*edge)->next); } *edge = newedge; } //列印儲存的圖 void displayGraph(st_edge** edge){ int i; st_edge* p; for(i=0;i<VERTEXNUM;i++){ printf("%d:",i); p = *(edge+i); while(p != NULL){ printf("%d ",p->vertex); p = p->next; } printf("\n"); } } //釋放鄰接表佔用的記憶體 void delGraph(st_edge** edge){ int i; st_edge* p; st_edge* del; for(i=0;i<VERTEXNUM;i++){ p = *(edge+i); while(p != NULL){ del = p; p = p->next; free(del); } edge[i] = NULL; } free(edge); } //深度優先遍歷 void DFT(st_edge** edge,int* vertexStatusArr){ printf("start BFT graph:\n"); int i; for(i=0;i<VERTEXNUM;i++){ DFTcore(edge,i,vertexStatusArr); } printf("\n"); } void DFTcore(st_edge** edge,int i,int* vertexStatusArr){ if(vertexStatusArr[i] == 1){ return; } printf("%d ",i); vertexStatusArr[i] = 1; st_edge* p = *(edge+i); while(p != NULL){ DFTcore(edge, p->vertex, vertexStatusArr); p = p->next; } }
相關推薦
棧實現的圖鄰接矩陣深度優先遍歷
#include <stdio.h> #define N 6 // 深度優先遍歷 void DFS_Traverse(bool adjmatrix[][N], int v0, void (*f)(int)) { bool visited[N] = {true};// v0設為已訪問 int
數據結構(三十一)圖的遍歷之深度優先遍歷
width depth idt 廣度優先遍歷 http 如果 搜索 src 技術分享 圖的遍歷和樹的遍歷類似。圖的遍歷是指從圖中的某個頂點出發,對圖中的所有頂點訪問且僅訪問一次的過程。通常有兩種遍歷次序方案:深度優先遍歷和廣度優先遍歷。 一、深度優先遍歷算法描述
資料結構之圖的深度優先遍歷和廣度優先遍歷
1.圖的簡單介紹 上圖就是一個圖(無線圖),由頂點和連線組成 圖可以分為無向圖和有向圖(這個又有出度、入度的概念)、網,一般來說圖有兩種常用的表示方式,鄰接矩陣(用二維陣列的形式表示)和鄰接表(主要是陣列+連結串列的形式表示),圖常用的遍歷方式有深度優先遍歷(DFS)和廣
圖之圖的深度優先遍歷
深度優先遍歷是連通圖的一種遍歷策略。其基本思想如下: 設x是當前被訪問頂點,在對x做過訪問標記後,選擇一條從x出發的未檢測過的邊(x,y)。若發現頂點y已訪問過,則重新選擇另一條從x出發的未檢測過的邊,否則沿邊(x,y)到達未曾訪問過的y,對y訪問並將其標記為已訪問過;然後
資料結構學習筆記(四) 圖之鄰接表實現深度優先遍歷
一下是使用鄰接表儲存表示,實現圖的深度優先遍歷的示例。 用於遍歷的有向圖如下: #include<iostream> #define MaxVertexNum 6 using namespace std; //抽象資料型別 typedef c
迷宮問題之圖深度優先遍歷解法
*Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱: *作 者:李佳駿
資料結構實踐——迷宮問題之圖深度優先遍歷解法
【專案 - 迷宮問題之圖深度優先遍歷解法】 設計一個程式,採用深度優先遍歷演算法的思路,解決迷宮問題。 (1)建立迷宮對應的圖資料結構,並建立其鄰接表表示。 (2)採用深度優先遍歷的思路設計演算法,輸出從入口(1,1)點到出口(M,N
圖的深度優先遍歷
next() connected tor endif class a pla spa and sin 圖的叠代 // // Created by liuyubobobo on 9/22/16. // #ifndef INC_05_DFS_AND_COMPON
各種圖的創建以及廣度,深度優先遍歷(臨接矩陣存儲)
visit pos code cell stream 相關 pri inpu mar #include <stdio.h> #include <iostream> #include <limits.h> #include <
有向圖的廣度、深度優先遍歷
add println adjacency 工具 pri pty author ted src 基於List存儲的鄰接表,一個工具類,創建一個有向圖: 代碼如下: package com.daxin; import java.util.ArrayList; imp
【圖的遍歷】廣度優先遍歷(DFS)、深度優先遍歷(BFS)及其應用
bsp 及其 spa (第五版 family 實驗 條件 soft 深度優先遍歷算法 無向圖滿足約束條件的路徑 • 目的:掌握深度優先遍歷算法在求解圖路徑搜索問題的應用 內容:編寫一個程序,設計相關算法,從無向圖G中找出滿足如下條件的所有路徑 (1)給定
《資料結構與演算法那》第七次 廣度、深度優先遍歷 圖及圖的遍歷(下)
《資料結構與演算法那》第七次課實驗內容 圖及圖的遍歷(下) 實驗目的: 熟悉圖的兩種儲存結構:鄰接矩陣和鄰接連結串列。 掌握在圖的鄰接表儲存結構上的遍歷演算法的實現。 實驗內容: 在已經開發好的c++類adjacencyGraph中,新增兩個成員函式,B
資料結構 圖的深度優先遍歷 C
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
JAVA實現圖的深度優先遍歷.
一:深度優先遍歷介紹. 1. 深度優先遍歷的定義: 假設圖中的所有的頂點都沒有訪問過,我們是任選一個頂點作為起始出發點(一般選擇使用節點集的第一個元素作為起始頂點)
6-1 鄰接矩陣儲存圖的深度優先遍歷 (20 分)
試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩陣儲存的圖,定義如下: typedef struct GNode *PtrToG
圖的深度優先遍歷(非遞迴+遞迴,詳解)
圖的深度優先遍歷 非遞迴演算法: #include<iostream> #include<stack> using namespace std; const int MaxSize=100; class MGraph{//鄰接矩陣的構建 p
6-1 鄰接矩陣儲存圖的深度優先遍歷 (20 分) 第七章--圖--基本概念-計算機17級
6-1 鄰接矩陣儲存圖的深度優先遍歷 (20 分) 試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩陣儲存的圖
資料結構——PTA 鄰接矩陣儲存圖的深度優先遍歷、鄰接表儲存圖的廣度優先遍歷
廣度優先與深度優先是遍歷圖的兩種基本方法,大致的思想是DFS為遞迴,而BFS是佇列。 這裡給出PTA兩道題目的答案,方法很基本,但第三個形參還是第一次見,去網上搜了搜給出的說法是呼叫函式的地址,但個人感覺就是呼叫這個函式。。。 下面給出兩段程式碼 void BFS ( LGraph
【資料結構】圖的深度優先遍歷 廣度優先遍歷
檔案操作比直接輸入方便許多 #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 20 /*鄰接表的儲存結構*/ typedef struct node /
資料結構 鄰接矩陣儲存圖的深度優先遍歷
練習6.1 鄰接矩陣儲存圖的深度優先遍歷 (20 point(s)) 試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰