|
|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢' H1 h" |7 n- r3 ^1 t
/*全局变量:访问标志数组*/
$ E- L% a/ a! ]int visited[M];5 e: ]3 r6 Y1 I }* i8 W* r. Z$ M
/*访问顶点*/' N2 t' x# |# {# m; a" [+ [
void visitvex(Graph *g,int vex)5 A$ s2 L" y4 q' q+ T0 G6 I
{9 h1 ]* j) G- ~( k; I
printf("%d ",g->V[vex]);- S, \4 U; w/ q0 i& X7 a5 @
}
! _. H. C/ ?% V; c( q4 k, X4 v9 k0 j$ u' I P) O9 b
/*获取第一个未被访问的邻接节点*/
6 K1 M) E9 _+ {6 b+ ?* P# Nint firstadjvex(Graph *g,int vex)6 `7 I b( p8 x* i/ G/ D
{
7 x% n5 Q n) lint w,i;
2 E) z8 d8 V& ~; ^0 i/ Ofor(i=1;i<=g->vexnum;i++)9 V% r- K6 T# X7 q% {: c
{
( l7 O; G8 P0 A2 q if(g->R[vex][i]==1&&visited[i]==0)2 H- \0 A9 I0 l
{
2 B5 b) C: Q1 H' X9 u w=i;, z" X" o9 w' V5 R! ^6 j1 g2 V
break;7 B+ {/ I& S5 K8 r: i
}
/ p, }% S0 `0 n9 L. g0 z else3 y5 r. Q2 p* @0 J3 b
{
, H y+ f5 L8 L$ Z2 L; b w=0;! O8 e/ B- S6 G) m* O" K5 b
}
2 E: a! V; z, f4 n( P2 e }+ C3 w: g$ p8 ?$ r# @$ I m$ m
return w;. E$ w0 F; ]7 [, e
}
6 n/ m$ [( A0 z" h! x2 _/*获取下一个未被访问的邻接节点(深度遍历)*/
5 [8 S* [# j; I0 Nint nextadjvex(Graph *g,int vex,int w)
/ y( G/ D i& v3 \{
8 ?* V0 v) W$ } int t;
$ t# _6 [+ m) b2 }9 Q6 D* Q t=firstadjvex(g,w);
# `/ a% ~7 L1 l0 T6 Z9 G6 p return t;' L3 o7 S6 ?( c( }8 x
}* V: v6 {7 Z5 G4 F) c
/*深度递归遍历*/
6 w" A5 d3 U& r* { void dfs(Graph *g,int vex)
1 ~, U) z* _/ h- I0 {. S {( ]: n4 {5 z4 ?# i
int w;
r' e1 r" o! U, F9 N; | visited[vex]=1;$ g1 a% ^/ N1 g- R$ F; R; w
visitvex(g,vex);
5 Q1 p6 _5 V0 ^5 z5 `& ?2 V4 ^ for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))) p% I9 a9 f* ~) [) E5 T. Z
if(!visited[w])
2 o' G' E, L1 Z6 A {
# x; U- a1 v5 M: N/ Sdfs(g,w);
9 ~: I: [" E6 K3 H' Z+ T9 s }; Q* p! H g+ g' d9 _, e, j
}
7 e* T0 D' {# t* |* A+ Q) L' H# N% d- U4 u/ V0 H
void dfstraverse(Graph *g)
+ c- B! l% d4 N) ~ {7 |$ y0 q- |7 E( X. l
int i;
- T$ v3 z9 x: p/ \ q9 k+ A1 @ for(i=1;i<=g->vexnum;i++)
( U" l3 _# Z0 t, R& ^& l `% l visited[i]=0;
" a/ j1 V3 B2 ?* F" v for(i=1;i<=g->vexnum;i++)* k9 \ ]7 |6 N t5 A1 T
if(!visited[i])8 O1 l4 ~6 Y/ m
{dfs(g,i);}
# f9 B4 v' f2 _ } |
|