|
|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢
" \5 o9 F" f6 U& x1 `# t' B/*全局变量:访问标志数组*/
- b4 N% y6 D( L0 c/ ?7 hint visited[M];
; x0 Q0 I, G1 p( @1 a! r3 s, n/*访问顶点*/0 R) ]+ T+ u$ w: |( b5 I
void visitvex(Graph *g,int vex)
$ }! y) M) R) d0 g{
' y" `( p# b2 C) Q: Jprintf("%d ",g->V[vex]);
% P$ O% l) ~' \! {3 ?4 _}
0 B {' l( o2 H9 Q, s9 u% a) Y
6 I9 S* P! H) J/*获取第一个未被访问的邻接节点*/: V3 I6 g1 p: m) B
int firstadjvex(Graph *g,int vex)
0 s! q- K: Z0 G8 y{
' @( Z3 C3 H- I- Nint w,i;
4 [1 [6 D; m9 U; ?: c% Ofor(i=1;i<=g->vexnum;i++)/ \# K) Q% i8 ^/ `! X$ Y; N; l% T
{
O+ U3 X$ F5 j Q/ r if(g->R[vex][i]==1&&visited[i]==0)8 a- V- ^5 q- z- d
{
1 r6 O5 ]) M% R: V( W9 U" F w=i;" z. r4 p" q" U/ v3 n
break;+ Q1 |9 x. u/ R& ]
}- o! l& H) N% f5 \0 p5 e
else) D( j. J( k, i: f: d. u* x1 b9 l8 L
{0 g" X l& p5 W, T
w=0;
4 g* k; Y/ ~8 L9 O3 ]9 ~ }
$ i2 L& f9 U4 D5 P I, h7 |* Z* c }6 z6 F) o% ~: N) B: R
return w;
6 B' f: \- r9 M' F}
8 i% p3 ]0 C2 R8 z1 d! S, \, e s/*获取下一个未被访问的邻接节点(深度遍历)*/# j7 S9 K" e P( D
int nextadjvex(Graph *g,int vex,int w)3 b, K) v' |, |, O$ h' F3 L8 Q R% v
{
+ X2 \# F& v$ R2 e% b int t;1 Y/ m: G& v- r4 r+ m8 i
t=firstadjvex(g,w);
$ ]5 I4 W4 @& F5 W* w& i return t;+ [, s) O& d9 C, F( ]' h( Z
}. U) Q$ R! p. D/ f9 M
/*深度递归遍历*/
% L/ n* q& T7 T+ d void dfs(Graph *g,int vex)3 ?& ]" j( B4 q \
{, R; S+ j$ {8 Z, h
int w;: R$ w( F9 `0 w& Q/ [, s" W
visited[vex]=1;1 ^% K+ s9 c# G( O+ W: |5 b9 A
visitvex(g,vex);
8 H) X+ y8 p- G. _. w for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
% z5 u2 y, y: t" L' ]0 i2 X if(!visited[w])/ S) @) H$ s) H0 a# e8 H. q
{0 q3 T1 l9 g N: ?
dfs(g,w);* I8 T* b6 `/ i7 {
}1 q. p) g$ [0 d4 n: ^2 \
}$ e6 \8 \5 r1 Y" j
: V& T7 y% @) p' h9 f8 v void dfstraverse(Graph *g), U/ u# d7 |8 L: d6 ^0 e
{, h% ]1 t# U0 A) J
int i;
0 @: p# Y0 w- h2 a( S( |9 R, ? for(i=1;i<=g->vexnum;i++)3 M3 F' D* p7 |# u
visited[i]=0;) u {1 r5 X( k: `; l# Q) W
for(i=1;i<=g->vexnum;i++)/ r8 N3 I+ P* z0 S; ~- R
if(!visited[i])
- V5 R- G& E5 u) H- n {dfs(g,i);}
: A w6 L/ S8 ]( t9 } } |
|