|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢
! ]$ o' y' p3 W1 R/*全局变量:访问标志数组*/$ E/ L0 ~0 p3 r& t, q. V6 Z
int visited[M];
% g4 o& S* p; J* J9 L! q/*访问顶点*/) q4 w: b3 @. ~
void visitvex(Graph *g,int vex)
. j! ^* h6 x) F4 B D% i{
# X' q: H0 Q; s0 Jprintf("%d ",g->V[vex]);
' |& q0 k7 H. Z' h0 u}5 k& l& d! j/ q m
; T e- q' F ^$ A) T0 A
/*获取第一个未被访问的邻接节点*// d8 W$ }' @" q5 i) {& I/ m9 [
int firstadjvex(Graph *g,int vex)3 }# a1 W q) M( y/ Q. J( m
{% y, u. p; k+ k3 K9 N
int w,i;# b0 x9 {/ c' l6 S6 N; \
for(i=1;i<=g->vexnum;i++)
6 w% Z! P9 q' Z, _ {
8 R5 F% V" v/ t2 A! S: v0 } if(g->R[vex][i]==1&&visited[i]==0)
( O3 |8 K& w0 a* P! R( @" e {
, e- s/ }8 G! w( q$ b0 i& @" S# D w=i;' C0 ?6 D2 l% {; V5 {/ b9 m* f# m4 D' v
break;
$ [' q5 p4 A! j4 f) J }- ]2 n8 s1 X7 w) v6 C9 ~$ `4 I
else
! G* n$ Z$ p/ z* ~" S1 V {
& N9 p% V. P! j ]& A+ e. a w=0;; \/ L: E* }% A: z% S% E9 ]/ f
}: Z7 g+ P1 `$ r. M6 j! P* O
}9 z- L* N" [3 i8 [, K
return w;
+ T7 }/ N6 d7 Z, d U}
; [7 I3 y3 f/ c% a! `/*获取下一个未被访问的邻接节点(深度遍历)*/
* w. U3 @4 j! ?; k5 jint nextadjvex(Graph *g,int vex,int w)
- N! j! c G- j5 ^' m- K{
) u3 ^( D2 \- U8 M int t;
, _) w% ?9 o. m: v9 i, J: ] t=firstadjvex(g,w);8 \5 u3 r: B9 N5 k" R$ a1 u
return t;
* d6 ], W9 v% G; X4 ]: n}
; F7 e6 A! [7 |: j+ B" e/*深度递归遍历*/2 d" x) k- x" B$ G# _2 L
void dfs(Graph *g,int vex)% R7 b% s( d+ ^2 J) q3 B
{$ x% {7 ?* Y/ ?% G7 f# ~
int w;- m. W F" v1 Q$ l% z
visited[vex]=1;" y! F% Z' O M: \1 c9 P& Z
visitvex(g,vex);
- Y5 V0 Y4 ~5 d' S* O& Z4 M$ N( q for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))1 C! a; U5 t' \
if(!visited[w])2 N: @0 |( T9 M/ s1 F) d
{2 [9 a6 Q' E' X5 w4 @6 k3 l
dfs(g,w);% g! z& C' V( e
}2 i; X! e9 K$ x: ? U0 h" w, i, i
}
2 o. v+ z' ~% ~9 Q5 C; Q
. y+ u2 e+ f5 j+ B6 Q void dfstraverse(Graph *g)
+ a/ t3 A+ R- C: l {. P. U# T2 r' }' A u% r
int i;
& K K; i4 ?3 W2 D# k for(i=1;i<=g->vexnum;i++)
2 ~4 ]3 ?7 w( L" I1 N visited[i]=0;
# n, Z- B4 V! \ for(i=1;i<=g->vexnum;i++)
- @1 H4 s' ?- v: m; Z if(!visited[i])
6 \4 }/ ^: D; h$ D2 d3 B7 ?; n {dfs(g,i);}
. F8 [- G. {- k1 O" A! N; u } |
|