1. 程式人生 > >無向圖 廣度優先遍歷 c語言實現

無向圖 廣度優先遍歷 c語言實現

這裡記錄一下無向圖的廣度優先遍歷,無向圖用鄰接表表示,使用的圖的示例圖如下,關於圖的表示可以參照部落格:無向圖的表示:鄰接矩陣和鄰接表,這裡不再贅述,無向圖的表示的程式碼被封裝到標頭檔案queue.h 中。
另外還涉及到C語言的佇列問題,可以參照部落格:C 迴圈佇列實現,同樣不再贅述,迴圈佇列實現的程式碼被封裝到標頭檔案graph_represent.h 中。

程式使用示例圖:
示例圖

實現要點:
每個定點有三個狀態,-1,0,1,-1:表示未發現的節點;0:表示已經發現但是還沒有處理的節點;1:表示已經處理的節點。在遍歷過程中同樣儲存了“樹邊(tree edge)”,樹邊表示在遍歷過程中經歷過的點。
程式框架如下:
這裡寫圖片描述

程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
#include "graph_represent.h"

void BFS(struct vNode** adj,int n,int s,int* parent){
    int* color = (int*)malloc(sizeof(int)*(n)); //-1:未發現,0:已發現,未處理, 1:已經處理
    int i;
    Queue* pending = createQue(n);  //建立佇列

    for(i=0;i<n;i++){
        color[i] = -1
; //所有節點處於“未發現”狀態 } parent[s] = -1; color[s] = 0; add(pending,s); //入隊操作 while(!isEmpty(pending)){ int v = poll(pending); struct vNode* w = adj[v]; while(w != NULL){ if(color[w->value]==-1){ color[w->value] = 0; add(pending,w->value); parent[w->value] = v;/**在這裡處理樹邊**/
} w = w->next; } printf("%d ",v);/**在這裡處理節點**/ color[v] = 1; } printf("\n"); } void main(){ //獲得預設圖,一共有7個節點 int n = 7; struct vNode** adjVertics = default_wraper(); int* parent = (int*)malloc(sizeof(int)*n); printf("\nbreadth first search:\n"); BFS(adjVertics,n,2,parent);//從第二個節點開始遍歷 }

從第二個節點開始遍歷,輸出為:2 0 1 3 5 4 6

相關推薦

廣度優先 c語言實現

這裡記錄一下無向圖的廣度優先遍歷,無向圖用鄰接表表示,使用的圖的示例圖如下,關於圖的表示可以參照部落格:無向圖的表示:鄰接矩陣和鄰接表,這裡不再贅述,無向圖的表示的程式碼被封裝到標頭檔案queue.h

深度優先 c語言實現

無向圖的深度優先遍歷的實現,無向圖用鄰接表表示無向圖的表示:鄰接矩陣和鄰接表。 程式使用的示例圖為: 實現要點: 每個節點有三種狀態: -1,還未發現 0,已經發現了,正在處理,還沒有處理

廣度優先及其matlab實現

margin cte align style -- als 矩陣 ffffff bre 廣度優先遍歷(breadth-first traverse,bfts),稱作廣度優先搜索(breath first search)是連通圖的一種遍歷策略。之所以稱作廣度優先遍歷是因為

廣度優先及其JAVA實現

isp all 表示 -- 排列 優先 bre image 完成 廣度優先遍歷(breadth-first traverse,bfts),稱作廣度優先搜索(breath first search)是連通圖的一種遍歷策略。之所以稱作廣度優先遍歷是因為他的思想是從一個頂點V0開

的鄰接表儲存 深度優先 廣度優先 C語言實現

ALGraph.h #pragma once #include "Queue.h" /************************************************************************/ /

資料結構---的鄰接表(建立、列印、深度優先廣度優先C語言

當一個圖為稀疏圖時,使用鄰接矩陣會浪費大量儲存空間。 鄰接表法結合了順序儲存和鏈式儲存方法,減少了不必要的浪費。 鄰接表 1)對圖G的每個頂點vi建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點vi的邊(對於有向圖則是以頂點vi為尾的弧)。這個單鏈表就稱為頂點vi

迷宮問題Maze (BFS) 廣度優先 C語言

給你一個迷宮, S為起點,E為終點。 請你找出走出迷宮所需要花費的最短步數。 你只能往上下左右四個方向移動。 輸入格式: 第一行有一個數字T,代表有T組測資。 每組測資的第一行有兩個數字R、C, 代表迷宮的大小(R x C)。 接下來R行,每行有C個字元來描述迷宮, '.'代表可以行

的構建及廣度優先---鄰接表實現

相關問題及基本理論已於前面的幾篇部落格中說明,現僅僅給出code。 code /* 無向圖的構建(鄰接表實現)及其廣度優先遍歷 */ #include <stdio.h> #include <stdlib.h> #define MAX_VERT

的建立以及深度與廣度優先C/C++

一、圖的儲存結構 圖有幾種最常見的儲存結構:鄰接矩陣、鄰接表和十字連結串列。 下面僅以鄰接表表示法進行圖的操作 鄰接表: 鄰接表(Adjacency List)是一種順序儲存結構與鏈式儲存相結合的圖的儲存方法。鄰接表類似於樹的孩子連結串列表示法。就是對於

- 廣度優先

希望 padding borde i++ arc UC 結點 深度優先 nowrap 圖的遍歷和樹的遍歷類似,我們希望從圖中某一頂點出發訪遍圖中其余頂點,且使每一個頂點僅被訪問一次,這一過程就叫做圖的遍歷(Traverse Graph)。 圖的遍歷方法一般有兩種,第一種是我

:深度優先廣度優先(Java實現

深度優先遍歷 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第一個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第一個鄰接結點。總結起來可以這樣說:每次都在訪問完當前結點後首先訪問當前結點的

資料結構--的理解:深度優先廣度優先及其 Java 實現

遍歷 圖的遍歷,所謂遍歷,即是對結點的訪問。一個圖有那麼多個結點,如何遍歷這些結點,需要特定策略,一般有兩種訪問策略: 深度優先遍歷廣度優先遍歷 深度優先 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第一個

二叉樹的深度優先廣度優先 [ C++ 實現 ]

  /**  * <!--  * File   : binarytree.h  * Author : fancy  * Email  : [email protected]  * Date   : 2013-02-03  * --!>  */ #include <stdio.h>

AVL樹的旋轉、插入、刪除及C語言實現

一、AVL結構定義 struct AVLNode { int val; struct AVLNode *left,*right; int height;//AVL樹的高度 }; typedef struct AVLNode A

【演算法】二叉樹的遞迴C語言實現

二叉樹是一種極其重要的資料結構,以下是二叉樹的結構定義 建立 和遞迴先序 中序 後序 遍歷的程式碼. #include<stdio.h> #include<stdlib.h> typedef char ElemType; /*二叉樹節點資料

廣度優先搜尋的c語言實現

    今天下午有時間,好奇圖論,所以把演算法導論的22章的圖論的基礎給看了一下,最後那個強連通分量我沒看,不知道有什麼用處,等到要用的時候再看吧,一切按照興趣走。晚上花了兩個多小時把廣度優先搜尋的部分給實現了一遍,感覺還是比較棒的。整個過程中的資料結構方面,我沒有因為實現

建立有的鄰接表,深度優先廣度優先的遞迴與非遞迴演算法,判斷是否是有,並輸出一種拓撲序列

/*(1)輸入一組頂點,建立有向圖的鄰接表,進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。 (2)根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。*/ #include<stdio.h>

基於鄰接矩陣的廣度優先

輸入第一行為整數n(0 < n < 100),表示資料的組數。 對於每組資料,第一行是兩個整數k,m(0 < k < 100,0 < m < k*k),表示有m條邊,k個頂點。 下面的m行,每行是空格隔開的兩個整數u,v,表示一條連線u,v頂點的無向邊。

的鄰接矩陣,深度優先廣度優先的遞迴與非遞迴演算法

/*(1)輸入一組頂點,建立無向圖的鄰接矩陣。 進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。*/ #include<stdio.h> #define max 40 //最大頂點個數 #define M 10000

的深度優先廣度優先(鄰接連結串列)

我選的是鄰接連結串列,建立如下圖所示的圖: 我把它畫出來,圖是這樣子的: 對於深度優先遍歷:是從一個頂點v出發,一步一步地向前推進,當找不到未訪問過的頂點時,也是一步一步地回退。其過程類似於用棧求解迷宮問題的搜尋方式。 比如上面這個圖:我從4這個頂點開始遍歷,它