|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢
! E9 P8 H% f0 }9 I/ m/*全局变量:访问标志数组*/0 s" H" N6 Q8 T3 k7 y! O$ m
int visited[M];
- O$ N8 H a7 t/ s/*访问顶点*/
( [5 g$ P: {2 |! O/ @6 ?- svoid visitvex(Graph *g,int vex)
* A) O& a0 r* u- S5 P% J3 Y{
, @# L9 j, V3 oprintf("%d ",g->V[vex]);8 S. g( P% u, i
}
( ~. \7 \! x3 z* R9 k0 H% Z1 p
" O- z8 s3 M6 D% F/*获取第一个未被访问的邻接节点*/
+ }& f* u; s! q; O7 Tint firstadjvex(Graph *g,int vex)/ X/ a. c+ q. c
{8 `+ \! V# T' R9 R
int w,i;
+ j1 a! ]! Q4 B2 Pfor(i=1;i<=g->vexnum;i++)
/ x8 Z V1 s! U- c* _% L! t% ?+ ` {: m) I% n* x7 R4 f' c
if(g->R[vex][i]==1&&visited[i]==0)- H/ O. D! S- `* @2 |; C( g
{
2 p( C$ O5 y6 l3 p5 R+ M7 e- e w=i;- m% q% T0 `- _. R9 J
break;" [ i+ x3 }. m9 Q% P
}8 D/ G1 Z: L! [$ _% \0 a
else D! w. @4 J, c1 @& g
{
, b" m' E/ ]$ l+ M# w# ^) L w=0;
6 r7 D4 C4 o/ S+ q( s }
# K7 A- F4 R' w3 E) z }
/ U( F% J+ [+ a- G7 ~ return w;6 Q$ @# g8 L& m' j2 k6 r
}* X" x; L% A2 |2 @
/*获取下一个未被访问的邻接节点(深度遍历)*/
! k6 [# g* L6 P* w$ }- Fint nextadjvex(Graph *g,int vex,int w)
5 Q- n! s$ ?$ Q1 F6 b{6 g5 Q" h3 J& o9 Y# S/ G9 w
int t;
* \0 b: S0 j9 H6 {+ ] t=firstadjvex(g,w);" y8 ?: _$ v0 D* H3 \
return t;
6 E, @9 U0 m4 C8 o% l5 O}
1 ?2 y! Z" w- U! W# p. i+ a9 C2 f/*深度递归遍历*/* }! [# Q' `% v J5 c
void dfs(Graph *g,int vex)
3 J8 A% r$ ~" W; Z {
, S9 O B4 e- P | int w;" h: f3 D/ E7 u1 h A3 N
visited[vex]=1;' }! I. w2 m5 W! C
visitvex(g,vex);
6 q: T! @* m o9 c for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))5 n0 V0 R0 `* U- C& {
if(!visited[w])5 g5 j; P3 l* m
{
. S- B. g0 |" o/ o: m" x: n# Cdfs(g,w);
& @9 V# p2 l& ~, P$ o }
! P* C- l3 j6 M5 N) A }
: C0 D3 w2 {/ K% }8 R% [6 x3 d% n4 r3 Q; @4 A1 b* b4 U! l
void dfstraverse(Graph *g)9 I0 o7 R! @) x, t/ y
{
4 [7 k9 w1 ` g3 q int i;
3 D( T1 C& U2 |8 T# r' h- g for(i=1;i<=g->vexnum;i++)! O- F3 b: A) T
visited[i]=0;
( Y" A+ f- P2 E$ J for(i=1;i<=g->vexnum;i++)' H- b0 T( _ o5 I6 `' Y
if(!visited[i])3 ~" e& G9 u! q
{dfs(g,i);}
! Q% A4 I' U4 z3 J! O3 I } |
|