|
算法过程: 1.将根节点放入队列中 2.从队列中取出第一个元素,将队列中的第一个元素弹出 3.将所取得元素的全部节点加入队列中 4.判断队列是否为空 a. 若是,则结束 b.若不是,则跳到第二步 - #include <iostream>9 c Y, U4 R5 \8 K5 M& x
- using namespace std;% o1 ~3 X. u- ^% a: O7 Z( k
- 9 {2 f! n# z- p& ^) w0 D
- const int verMax=9;2 K' z) X- v$ d# A4 u j( k0 e# X' J
- const int queMax=10; // >=9皆可
/ m9 C3 z b% X' J% W. I8 h' ~( x, o4 | - 5 s, a) ?9 j. c+ p
- struct node//声明图形顶点结构' v4 q' u2 S4 D
- {
3 ~" ]+ |" i x# d - int vertex;
+ y/ L! t. j( `- l/ @, ^$ g0 k3 {1 ? - struct node *next;2 l/ n% l# k+ O* J& ]
- };
3 x- I. |9 S$ Y8 ~& o5 {' Z
0 V4 X) v4 u e# S9 N1 C! Y- typedef struct node *graph;8 {+ j/ d7 q1 c
- struct node head[verMax];//声明顶点结构数组5 ]5 P V3 n0 S' p" {! `8 Z
- int que[queMax];! b: s$ Z+ t& f( w, Z/ s2 D0 l) o
- int front=-1;
4 j2 x% y5 ]( c - int rear=-1;* z3 Z" F, t3 {* M. N
- int visit[verMax];//查找记录//队列的存入
6 b+ g1 k# D2 s8 V" m: {, @
) U7 [! N* C! c" D! N( l- int enque(int v): {+ j3 Z" A, t) O. w# f5 j
- { M! t' i$ K3 @5 Y! N- w
- if(rear>=queMax)//队列已满( O7 S: R* m$ a1 V
- return -1;4 A; _6 ^- Q5 I+ f2 b6 n
- else
% |4 X/ y; @' K- V/ x; o - {; A5 x6 z. F3 i' @
- rear++;//对了尾端指针后移7 p9 z9 i( l9 _% Q8 f$ U- T
- que[rear]=v;//将值存入队列中
$ r. A) A- `6 [3 h - return 1;
! a7 n+ H3 u- k. G! Y, @# J - }
" P Y$ n! n1 `) H# K9 v7 z4 z/ W. w - }
8 M% p* o5 _* I% @3 m4 _+ z6 q - //队列的取出
& `: f+ X" p2 M& E - int deque()- `' C2 U4 n! e, u
- {7 |) A* M2 @5 w1 _4 F
- if(front==rear)//队列已空. I* j( h. l" Z: \: s$ ]
- return -1;5 z7 d4 ~. ?' x' p
- else9 p- l& C* o& Z& w$ V; v; q H& H
- {3 b: h8 K3 n R' F- h4 `7 L
- front++;
; w n, b8 A. Q" V - return que[front];6 l( R9 a b3 r4 n, m$ x- E
- }
+ @" E3 x0 I/ I5 L4 ~4 {, J, M7 r - }
3 Z6 X0 ~4 o1 n' W - //广度优先搜索法
# b2 v8 ?! e+ x$ Q1 H1 O$ R8 s - void BFS(int v)
# A. c& ] Z3 p" X1 z, B! ^ - {
& B1 J0 X4 t( j: l" {7 w* t$ ` - graph point;, I6 L1 h* S1 m& s/ y @( V
- enque(v);//存入队列
& m; ^- W# b1 x - visit[v]=1;//已查找6 L! M1 e8 r9 V" g) O
- cout<<"["<<v<<"]==>";
, h$ F1 x* S. ^/ v( F0 @ - while(front!=rear)
8 ]: F* n* S* w8 H* Q5 T5 T - {$ F5 |0 S9 \% R
- v=deque();: a! e$ _- M$ \- @- F; g) v$ i# O! b* G
- point=head[v].next;9 N: q8 ~& C3 V& I
- while(point!=NULL)//读入邻接列表所有顶点
# t/ j k4 O2 d( C - {* l2 [8 h2 Y. b: h2 z$ _4 E
- if(visit[point->vertex]==0)4 f4 T+ s, ]. e; x9 {
- {( }& P5 C) w& ~; r" g. U( e f
- enque(point->vertex);//存入队列
+ T, {4 B7 B" C. [- M+ t3 q j - visit[point->vertex]=1;//已查找过的顶点
% T$ s$ R, D/ V; P2 G2 W - cout<<"["<<point->vertex<<"]==>";
+ W, {& x- l' ?! z; e7 w - }
d$ a/ O. @$ T3 X9 d - point=point->next;
/ Y a# G) _. H) Y( {# n0 e - }1 V" D# l1 v: a! ^. o& W1 w0 F
- }
7 m! ~( U* S" I Y' l - }1 p+ K3 R. ~- [* I- z6 P
- //建立邻接顶点至邻接列表内
% P1 `9 u1 y( m( A4 F1 ?% Z( ] - void create_graph(int v1,int v2)# X, g) i9 H5 Q7 Y! Q
- {
+ g2 }! X3 r" z1 i, C - graph point,New;7 r( E# T! `7 I( h/ W4 L
- New=(graph)malloc(sizeof(struct node));. _* `1 O1 u7 W6 k2 U) ]6 G
- if(New!=NULL)
: W/ W: g, [2 N& W' b% c8 i4 w S. C1 l, N - {
9 g0 `! G, ?5 Z8 K7 O - New->vertex=v2;//邻近顶点7 T8 j3 X4 T' N
- New->next=NULL;
4 W+ w5 P i) ^4 Q - point=&(head[v1]);
: _7 X, W9 k" ?( M& n - while(point->next!=NULL)
" Z7 b) _& n- s4 P1 p; l. j - point=point->next;
1 n; j3 p; m4 }1 A. ~7 V5 ` - point->next=New;//串连在列表尾端1 z* m+ y1 g4 u# x+ j" d2 Y9 [
- }
( y# F0 i8 ?. q* W* I - }- A) ~" r6 V" X& |5 t
- //输出邻接列表内数据6 W9 @) o% T2 j
- void print_graph(struct node *head)! f4 a8 }8 g( Y5 K' k
- {
4 x% D& O1 ^) A! @8 n i" l! @ - graph point;
9 f n) D4 E- L' ` o/ b9 x) K - point=head->next;//设置point为首节点+ m- F! h5 m6 i7 h3 u1 b1 W
- while(point!=NULL)) o( s5 y2 z0 J! i
- {
3 t8 z: E6 ]% g X+ q v - cout<<"["<<point->vertex<<"] ";/ {# L9 K" [* V, h0 M$ o
- point=point->next;4 S7 P& o/ }$ ^! k
- }
6 t/ L) s, ]9 y1 r3 E" t& b - cout<<endl;
1 z9 s w# L6 W% L; n9 o - }& F9 a$ X$ J& p8 l" b$ f t5 c, `, I
- //主程序2 S+ y: I# E* K' f5 g" i3 h% K
- void main()
7 T: ^* I7 {8 n. ~7 X - {
# D3 l' G7 k. j6 z - int node[20][2]={
' I8 C% o4 z2 R - {1,2},{2,1},{1,3},{3,1},{2,4},{4,2},{2,5},{5,2},{3,6},{6,3},4 p3 T6 ` U* m( U: |
- {3,7},{7,3},{4,8},{8,4},{5,8},{8,5},{6,8},{8,6},{7,8},{8,7}};$ b. r, V; k& E* v a* m' |
- int i;8 D& ~: ^/ y9 S' r3 ~' v/ X
- for(i=0;i<verMax;i++)9 c. i7 j6 f2 }+ S4 q) t
- {. N: p- o# D4 r0 Z6 c9 \
- head[i].vertex=i;, N. d/ d6 c) T- b
- head[i].next=NULL;
; n4 I, D4 J7 d. k - } ! j* K' J. m5 J7 V
- for(i=0;i<verMax;i++)
0 c( ?* q( ]9 s - visit[i]=0;8 {4 B) J4 y3 y- y
- ! z- D1 R: m& @: @0 R% Y& J% r4 D
- for(i=0;i<20;i++)
1 W1 M) z( u2 E% g$ S4 s - create_graph(node[i][0],node[i][1]);
5 w/ b1 M* Y6 {) A8 J - : q& a, T, L% U: E
- cout<<"======Graph======"<<endl;' Y9 e. x& d, Y7 O' K- N
- for(i=1;i<verMax;i++)
; u5 b: d2 V1 {2 ?: C* b - {3 p; l( p4 f. e' e
- cout<<"Vertex["<<i<<"]: ";, f) M+ N( {2 U# X T5 s
- print_graph(&head[i]);5 {- H& y1 i @, W
- } * F- Q+ W' [8 ~, c8 C
- //广度优先搜索& l! c L9 \1 b6 s$ T
- cout<<"Bradth-First-Search:"<<endl<<"&BEGIN==>";5 O8 c$ H- w2 v$ N% K1 L( v
- BFS(4);. W5 o# C& v; \4 ]! M
- cout<<"END&"<<endl;
9 Y8 b) L5 |4 n8 W0 w! O - }
复制代码 ( L- }/ X+ X' Y' _
: ~" \+ @' W$ z& l
/ R) j* u! `! p6 }! Y$ M, U& k |
|