|
|
发表于 2009-4-25 22:23:50
|
显示全部楼层
学习了.谢谢
* o( j& `% G i$ m9 s/*全局变量:访问标志数组*/6 ?( v8 ]; {' |9 \; \- t7 H8 s
int visited[M];/ p& z3 z& v9 n" j+ X( M6 e$ G! v: E
/*访问顶点*/, L2 |/ ]3 ]# U2 L8 b& \- o$ e: J2 E
void visitvex(Graph *g,int vex)$ B3 G- |$ J6 R
{' i( X7 L6 [! t \+ H
printf("%d ",g->V[vex]);
/ o7 K# V" `$ R. a- R}
8 } I; E% l8 ^
2 l) c8 V9 D% s: l/*获取第一个未被访问的邻接节点*/
9 I: I6 t! P0 z! k" F& Cint firstadjvex(Graph *g,int vex)) R4 N; \) f6 z0 p: `: w
{ v, k- u4 L3 v6 s5 c5 j
int w,i;! M0 J$ M5 W6 V1 I
for(i=1;i<=g->vexnum;i++)
! u3 }7 V5 ^2 L) Z4 K {# j, y5 H* _/ y
if(g->R[vex][i]==1&&visited[i]==0)
$ |5 _8 T" L; @* @ t {
5 ?- Y4 J- Z- H7 \/ ` w=i;
. q$ f2 I7 _2 W0 h break;& ?+ g' n. [3 I; _0 E+ `
}
/ n g/ |: A$ r6 _& G5 e else% T# V" s( H" Q7 F
{
$ Q& a9 x( w$ r2 r- n w=0;' W9 e2 ]; o, j- t
}
R6 D* d0 C5 {; g }
A( t, ]# w7 C return w;8 i M* w* s8 t* K$ T1 d7 H# C
}
j' I9 }. P+ Q- [) q' h/*获取下一个未被访问的邻接节点(深度遍历)*/4 Z7 R! g: U, J2 e1 Q2 X1 ]( H
int nextadjvex(Graph *g,int vex,int w)) l- X- ^% P! ^ O4 G, x, X
{
( t9 ]" J: w& t) v int t;
- g* w( j2 {) I) h t=firstadjvex(g,w);0 M+ d$ P; h8 M. \7 E+ v& `1 l9 E% N2 H+ d
return t;0 H+ w) [- V7 N# `5 h
}# T! j1 f O) K% F$ j
/*深度递归遍历*/
0 r, C0 ~6 j( y0 Q void dfs(Graph *g,int vex)/ g) G3 l4 e' S2 H; N) d. R4 A6 b
{
; r2 P# m5 h2 \! P2 D int w;. [/ Z6 W# S4 K2 R6 F* f' J
visited[vex]=1;
* {6 Q+ {. S4 u& ^1 ^* q visitvex(g,vex);; ^6 F9 @' F# l; T" n" s
for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
W8 @" Z6 L2 g if(!visited[w])
- |( N7 K2 |1 \/ f {
" ] ~7 A; E2 r# \& ~dfs(g,w);
& V# S! T, j, S+ T! f% E; f }
; [( N7 I7 c: |0 X2 x }9 c1 D5 @! p" `3 M1 l7 h: ^
4 V$ k) i/ l( t void dfstraverse(Graph *g)
3 O T Q, q# `( s) A$ Z { P8 e4 ?* N% j+ o0 r G/ C
int i;
& j) E% H, n7 j$ g( [* R! F for(i=1;i<=g->vexnum;i++)- ~9 s" z# n# X' F
visited[i]=0;
2 _4 \* V, j2 }( ^4 x( c for(i=1;i<=g->vexnum;i++)! [$ {' A4 e- k
if(!visited[i])3 F4 X) T( B- s5 O; H) m
{dfs(g,i);}
( ~) d4 I# a" O/ M } |
|