廣度優先遍歷,類似於樹的按層次遍歷。設圖g是連通的,且圖g的初態是所有頂點均未被訪問過。從圖g的任一頂點vi出發按廣度優先搜尋遍歷圖的步驟是:訪問vi後,依次訪問與vi鄰接的所有頂點w1,w2,w3......wn,再按w1,w2,w3......wn的順序訪問其中每個頂點的所有未被訪問的鄰接點,再按此順序,依次訪問它們所有未被訪問的鄰接點,以此類推,直到圖中所有頂點均被訪問過為止。
比如,以下面的圖為例(包括不連通的頂點):
圖中包括9個頂點,頂點序號為0~8,頂點資訊為依次為字元 'a' ~ ' i',其中頂點8不與其他頂點相連通。
利用遞迴形式的深度優先遍歷:
遍歷結果:0->1->3->7->4->5->2->6 ->8 輸出結果:a->b->d->h->e->f->c->g->i
利用非遞迴形式(棧)的深度優先遍歷:
遍歷結果:0->1->3->7->4->5->2->6 ->8 輸出結果:a->b->d->h->e->f->c->g->i
利用廣度優先遍歷(佇列):
遍歷結果:0->1->2->3->4->5->6->7 ->8 輸出結果:a->b->c->d->e->f->g->h->i
程式如下(有問題共同交流):
#include#include#include#define num 9
#define maxsize 15
using namespace std;
typedef struct graph
;typedef struct stack
;typedef struct queue
;//直接建立圖
void creategraph(graph * g);
//深度優先遍歷(遞迴形式)圖中所有連通頂點,列印頂點資訊
void dfs(graph* g, int i, int visit[num]);
//深度優先遍歷(遞迴形式)圖中剩餘其他頂點,列印頂點資訊
void finaldfs(graph* g, int visit[num]);
//建立棧
void createstack(stack *s);
//判斷棧是否為空
int emptystack(stack *s);
//將頂點序號入棧
void pushstack(stack *s, int k);
//出棧,取棧頂元素
int popstack(stack *s);
//利用棧,深度優先遍歷(非遞迴形式)圖中每個頂點
void dfs_stack(graph *g, int i, stack* s, int visit[num]);
//利用棧,深度優先遍歷(非遞迴形式)圖中所有頂點
void finaldfs_stack(graph *g, stack* s, int visit[num]);
//建立佇列
void createqueue(queue *q);
//判斷佇列是否為空
int emptyqueue(queue *q);
//入隊,將頂點序號入隊
void enqueue(queue *q, int e);
//出隊,將隊頭元素出隊
int dequeue(queue *q);
//利用佇列,廣度優先遍歷圖中和源點i相連通的所有頂點
void bfs_queue(graph *g, int i, queue* q, int visit[num]);
//利用佇列,廣度優先遍歷圖中所有頂點(包括不連通頂點)
void finalbfs_queue(graph *g, queue* q, int visit[num]);
int main()
; //利用深度優先搜尋遍歷(遞迴形式)
printf("深度優先遍歷(遞迴形式): ");
finaldfs(&g,visit);
printf("\n");
//利用深度優先遍歷(非遞迴形式:棧)
printf("深度優先遍歷(非遞迴形式 棧): ");
int visit1[num] = ;
stack s;
createstack(&s);
finaldfs_stack(&g, &s, visit1);
printf("\n");
//利用廣度優先遍歷(佇列)
printf("廣度優先遍歷(佇列): ");
int visit2[num] = ;
queue q;
createqueue(&q);
finalbfs_queue(&g, &q, visit2);
printf("\n");
return 0;
}//建立圖
void creategraph(struct graph * g)
//直接建立圖的鄰接矩陣
g->matrixs[0][1] = 1;
g->matrixs[0][2] = 1;
g->matrixs[1][0] = 1;
g->matrixs[1][3] = 1;
g->matrixs[1][4] = 1;
g->matrixs[2][0] = 1;
g->matrixs[2][5] = 1;
g->matrixs[2][6] = 1;
g->matrixs[3][1] = 1;
g->matrixs[3][7] = 1;
g->matrixs[4][1] = 1;
g->matrixs[4][7] = 1;
g->matrixs[5][2] = 1;
g->matrixs[5][7] = 1;
g->matrixs[6][2] = 1;
g->matrixs[6][7] = 1;
g->matrixs[7][3] = 1;
g->matrixs[7][4] = 1;
g->matrixs[7][5] = 1;
g->matrixs[7][6] = 1;
}//深度優先遍歷(遞迴形式)圖中所有聯通頂點,列印頂點資訊
void dfs(graph* g, int i, int visit[num]) }}
//深度優先遍歷(遞迴形式)圖中所有頂點,列印頂點資訊
void finaldfs(graph* g, int visit[num]) }}
//建立棧
void createstack(stack *s)
//判斷棧是否為空
int emptystack(stack *s)
//將頂點序號入棧
void pushstack(stack *s, int k)
else }
//出棧,取棧頂元素
int popstack(stack *s)
else }
//利用棧,深度優先遍歷(非遞迴形式)圖中每個頂點
void dfs_stack(graph *g, int i, stack* s, int visit[num])
} if (flag==0)
}}//利用棧,深度優先遍歷(非遞迴形式)圖中所有頂點
void finaldfs_stack(graph *g, stack* s, int visit[num]) }}
//建立佇列
void createqueue(queue *q)
//判斷佇列是否為空
int emptyqueue(queue *q)
//入隊,將頂點序號入隊
void enqueue(queue *q, int e)
else }
//出隊,將隊頭元素出隊
int dequeue(queue *q)
else }
//利用佇列,廣度優先遍歷圖中和源點i相連通的所有頂點
void bfs_queue(graph *g, int i, queue* q, int visit[num])
} }}//利用佇列,廣度優先遍歷圖中所有頂點(包括不連通頂點)
void finalbfs_queue(graph *g, queue* q, int visit[num])
}}
輸出結果如下:
深度優先遍歷 和 廣度優先遍歷
圖的廣度優先搜尋是樹的按層次遍歷的推廣,它的基本思想是 首先訪問初始點vi,並將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點 vi1,vi2,vi t,並均標記已訪問過,然後再按照vi1,vi2,vi t的次序,訪問每乙個頂點的所有未被訪問過的鄰接點,並均標記為已訪問過,依次類推,直到圖中...
廣度優先遍歷和深度優先遍歷
深度優先遍歷 廣度優先遍歷是圖的一種遍歷方式,它的思想就是遍歷這個點相鄰的所有的點,再對這些點進行廣度優先遍歷.如下圖所示 首先我們從a點開始遍歷,然後遍歷所有和a相鄰的點f和點g 然後對f和點g進行遍歷進行遍歷,得到點e,h,k和b 然後再繼續,知道所有的點都遍歷完成 首先,我們先定義圖graph...
廣度優先遍歷和深度優先遍歷
1.1 概念 以初始節點v0作為第一層節點,接著訪問它。然後迭代第一層節點即v0,訪問它相鄰接的沒有訪問過的節點比如v1,v2,v1,v2加入到第二層節點 迭代第二層節點v1,v2,v1,v2依次訪問相鄰接的沒有訪問過的節點,重複上述步驟直至所有節點都被訪問過為止。如圖所示首先訪問根節點v0,並將v...