|
|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢+ Y L3 l! ^- J! z) x; h# y
/*全局变量:访问标志数组*/' R. H/ ?3 a7 T3 P1 g
int visited[M];" n3 o. `8 p" W' Y
/*访问顶点*/
6 O: L5 D7 A, t$ ]void visitvex(Graph *g,int vex)1 F) D- O9 y2 h, \: c8 Y
{$ u/ X7 J+ o% ]
printf("%d ",g->V[vex]);: P) F! }8 Y G* Q4 g8 j$ H
}6 a7 e$ D* B& Z4 t
0 [! o/ Q$ j) r1 ?
/*获取第一个未被访问的邻接节点*/
3 Z2 a& |9 L Sint firstadjvex(Graph *g,int vex)
) w5 Y% r+ Q7 @9 O1 `' ?{3 E- ~: m% N8 @0 W
int w,i;
$ x9 M) J3 B) f. o; @" J" C3 xfor(i=1;i<=g->vexnum;i++)
8 d4 x5 P4 h; a/ g5 b7 w! J* b {. \, g! ]; c% S2 [3 @2 m/ C$ T1 o: r
if(g->R[vex][i]==1&&visited[i]==0)
- [! |3 K0 r7 F+ \5 S% [ {0 [6 J% L0 b) E- X: d
w=i;' U p3 ]! \2 N7 {0 J8 D- `1 x
break;
/ n/ `+ c# P- }4 h o2 K0 |. s X }- d* @ f" y" [
else% Y6 C0 J! z3 |- }- `7 m; S0 R' {
{
; L( e, O( ~! `& P w=0;: J W3 R- ]) ~
}1 D3 q, n$ e/ I9 S( n$ G3 e7 ^
}% S4 Q' Z" ]; F$ a6 \/ _
return w;+ D" f. X; _8 j) h, @1 T5 I
}
+ y, ?' C4 @0 o1 M* ?4 }+ M/*获取下一个未被访问的邻接节点(深度遍历)*/
4 ]* F' A; O) ?; Mint nextadjvex(Graph *g,int vex,int w)7 U/ V: Z" _' n6 E, E' l ?
{
: ~9 L# _$ N" A+ |* Y H% U int t;8 y! S' `/ k2 Z/ P
t=firstadjvex(g,w);
, T! N8 T9 I! t) E( S2 {- j return t;, t0 V$ j1 h/ r% o+ z! B1 F0 N/ Q
}
" I- G* W; ]) c. e8 f X0 o/*深度递归遍历*/
6 y m- L1 u, G" R/ Z void dfs(Graph *g,int vex)
' O. u% w6 d. ^( P2 ~# @) e; s {/ p4 _( E: Z; E1 N7 u8 A
int w;% D+ ]/ S7 x6 x8 u8 c- G
visited[vex]=1;
- [4 u- A! q5 w9 |& j# R$ c visitvex(g,vex);
O9 D! D# b- t6 x+ M: s. s5 b for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))1 L: ^) _# \' O' g* j' I8 N
if(!visited[w])
) L5 J3 v# E4 \6 g {' I7 ~: X8 p1 a6 m) D* w2 ^
dfs(g,w);
+ w! F2 q: D* V% ~% ^ }+ \+ N; h, v& I+ Z! _) t
}% @1 v2 ^) v+ r4 s P/ d
. D1 v& W( z0 J7 T void dfstraverse(Graph *g)
* _) U7 t3 s4 q8 I; l9 Z {
6 i& s1 Q; Q5 \ int i;& W6 q& N# V3 d" S0 u9 z
for(i=1;i<=g->vexnum;i++)
* K Y0 u8 v0 P* t8 b) N visited[i]=0;
" L/ f" C4 j+ b' B* ]: f D for(i=1;i<=g->vexnum;i++)
* T) j" {6 }+ {' e; ?4 [- d$ R if(!visited[i])
7 u, Y0 o, D* C {dfs(g,i);}8 w0 X4 D) J$ E1 g+ {! t
} |
|