1. 程式人生 > >圖之圖的深度優先遍歷

圖之圖的深度優先遍歷

深度優先遍歷連通圖的一種遍歷策略。其基本思想如下:

設x是當前被訪問頂點,在對x做過訪問標記後,選擇一條從x出發的未檢測過的邊(x,y)。若發現頂點y已訪問過,則重新選擇另一條從x出發的未檢測過的邊,否則沿邊(x,y)到達未曾訪問過的y,對y訪問並將其標記為已訪問過;然後從y開始搜尋,直到搜尋完從y出發的所有路徑,即訪問完所有從y出發可達的頂點之後,才回溯到頂點x,並且再選擇一條從x出發的未檢測過的邊。上述過程直至從x出發的所有邊都已檢測過為止。

例如下圖中:

1.從0開始,首先找到0的關聯頂點3 2.由3出發,找到1;由1出發,沒有關聯的頂點。 3.回到3,從3出發,找到2;由2出發,沒有關聯的頂點。 4.回到4,出4出發,找到1,因為1已經被訪問過了,所以不訪問。 所以最後順序是0,3,1,2,4 c語言實現如下:(使用鄰接矩陣儲存)
#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是鄰