|
|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢& W8 r" u1 s# s9 O. ~
/*全局变量:访问标志数组*/
* S; K! _/ U T6 @) C, Cint visited[M];
8 m+ P* U0 v3 c6 h5 E2 b5 I/*访问顶点*/
( h" z- B4 W v( Rvoid visitvex(Graph *g,int vex)3 H m( a9 q& N8 R
{7 c3 d A" S; D* l
printf("%d ",g->V[vex]);. I, d( j6 j$ {/ v
}: s$ g, r y' x- V
6 i% d" w6 u# G t4 c
/*获取第一个未被访问的邻接节点*/
4 o: o- |1 @9 ]7 g. v* zint firstadjvex(Graph *g,int vex)
7 t7 _, ?& A& w5 W{
$ i+ |. c+ r5 \5 @int w,i;$ u! D2 M$ @8 t$ B
for(i=1;i<=g->vexnum;i++)* p" h, p: ~" i1 o# t
{$ @1 P" b$ V+ T: z/ c
if(g->R[vex][i]==1&&visited[i]==0)
. z# K; x5 q* l6 b5 u5 [ {5 M) p* b2 V" c1 R3 D9 u' a8 E9 ^
w=i;
' @, [- N: H' o/ W: p break;. ^" R, R- G5 H5 m" a" y- |! }5 p4 G% \
}/ X/ H& ^/ l+ L% O6 u
else
7 r7 C/ z8 O, i9 C1 _, R {0 h% a6 p) c) x& O# q: n
w=0;/ L+ Y1 Q9 a9 {5 u! k
}
" N/ E7 X d* Q1 W" h: h }& R" U+ S7 Z: W: |/ R. d1 Z
return w;
- _! W8 i9 g9 u* a}; ^2 `: [! ?. D9 A% F
/*获取下一个未被访问的邻接节点(深度遍历)*/
; s7 w$ E) N% Z; h0 eint nextadjvex(Graph *g,int vex,int w)- k1 Q" @8 K9 I, a1 n: L5 `
{
7 h4 z! d( X' J! E4 v; N int t;
: E; }! J; P. L, @: l t=firstadjvex(g,w);: C4 G! Y% l0 u g) e
return t;9 @9 f- M. S1 A, N c5 T
}
" W1 u) O% h2 z p5 \7 ^" r+ ~/*深度递归遍历*/
0 V* d2 b. }) c. v) Q8 f void dfs(Graph *g,int vex)# G- h' G# {3 s
{9 u8 o1 m" C0 L2 S- v6 }. u) b
int w;
, ^" w, H5 x* M# E# j$ E9 c7 A, U visited[vex]=1;
0 Z ]. }. A) z+ m$ \ O visitvex(g,vex);5 C9 y' T" t i0 K: Z
for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
/ c9 s7 U; }0 Q; d if(!visited[w])6 C5 h+ ]. G1 b& `( f7 W
{
& G3 @5 v' J6 P! A" f E" ? Ldfs(g,w);" g H9 v- h* `+ v+ x6 B
}
/ `9 U% P- G' _ K }
0 d1 f. ]) _8 `( w$ Z! k0 {! U7 U; C5 V
void dfstraverse(Graph *g)5 D" [! ^- H% }; X
{$ q$ y; F n5 [2 J" e2 b# a
int i;/ G/ q' I- ^* t5 @2 L, ~
for(i=1;i<=g->vexnum;i++)! b/ h* _& S5 b- t
visited[i]=0;" D1 ]" C t. ?
for(i=1;i<=g->vexnum;i++)
2 j$ m4 l: \6 g9 F1 t* h* d8 I if(!visited[i])
7 R& z% |2 M7 `6 |! }0 [+ E {dfs(g,i);}7 I) \4 e5 j/ t; z9 t0 o
} |
|