|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢
; n v7 R2 |* K0 A& x3 ?/*全局变量:访问标志数组*/1 a& u- J6 j; S( ?" _3 _) [
int visited[M];: f* G) y* ~& b) W
/*访问顶点*/
( ?" Y1 |' `+ B, d, f6 G- F! s& tvoid visitvex(Graph *g,int vex)
n# l, P- l. o) @# I5 R2 X, o{' K0 z, w' i3 c3 m0 {# F Y5 ~9 }
printf("%d ",g->V[vex]);
. ~7 @# @; C% v6 C}/ F4 Q' @% T3 A3 i1 r
3 C/ |& O+ b# @: E! v( \/*获取第一个未被访问的邻接节点*/
3 o! ~, k) }9 }5 l6 q2 ^4 aint firstadjvex(Graph *g,int vex)8 ?8 u9 }- x$ B8 A
{
* S8 S9 I5 L3 Iint w,i;
' D8 C- Q$ }& i6 Bfor(i=1;i<=g->vexnum;i++)" X) V% j% g9 n' ^& r Q: ^! h
{ e' E- ^ H6 m0 a$ b/ T
if(g->R[vex][i]==1&&visited[i]==0)) k8 P# R3 j* C
{
( d$ v* ~, g- l F! ?& K w=i;5 y0 K0 {2 i" b; c
break;
$ H8 q5 x/ Z: ~" b1 O# @7 ^+ h U }
, J( J2 y5 O, n# [# m else9 _8 i: t9 K+ D
{+ c z( I' Q2 l! G
w=0;
, h5 t1 {8 a, B. v8 X9 T& k }
: k7 i- ]% D8 F3 c& @2 O1 f' ]- v }
- x4 J( w( W; G1 l5 u return w;
8 l7 p4 B! G$ T3 S}5 j( e; z4 D0 K9 k& Q
/*获取下一个未被访问的邻接节点(深度遍历)*/
$ v4 L \4 J2 F: Nint nextadjvex(Graph *g,int vex,int w)( p" B, L$ p& q+ a
{
8 j z7 A! I: m: i2 H3 }* Y int t;& ?& b6 W$ W, W# `" r" Z
t=firstadjvex(g,w);3 M7 @* v4 o( H3 c0 a
return t;' g, p# B7 `8 @" ~
}% k. x6 }# b9 q$ a2 U; J
/*深度递归遍历*/6 w6 ]9 O! v ]# t4 x9 I- a
void dfs(Graph *g,int vex)& m0 G4 ~7 c4 S4 F- N- f
{7 e3 u! C0 v I
int w;2 B+ o+ O+ j- f9 j6 m2 K& Z" G
visited[vex]=1;/ I" V U: G. Q$ Z% I
visitvex(g,vex);3 A ^: t8 u7 j2 v0 e$ P4 G7 f
for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))- S! i/ [8 q$ b- ]7 ~7 S# a
if(!visited[w]) _" b$ \# n; X' m! ]
{) {# C$ y+ j7 q5 Z0 F' G( K2 P
dfs(g,w);
1 U7 l5 _7 B/ E$ e2 ~& ^ }
& Z1 r$ f" Y0 i d }
; O$ B* `" o8 ? |* n1 q1 f
* `$ p! U3 |6 m" `- z3 g7 G void dfstraverse(Graph *g)
9 h+ T; Y$ B( H7 J {
4 K: N; l! T! m" j/ h. Y+ e. n int i;2 f- ?( k* _; y
for(i=1;i<=g->vexnum;i++)% w; g4 b- G& r0 l: C# A
visited[i]=0;- `5 A7 `9 g- P" Q: g
for(i=1;i<=g->vexnum;i++)
. E6 H8 U! y6 H! Y! R if(!visited[i])
% z! v$ v6 ?. f0 J {dfs(g,i);}( B* |7 f* k8 i& _0 r! |
} |
|