! Q3 `- l N2 x. Wtemplate<class ElemType, class WeightType> * l) \+ d0 P/ ^0 evoid MultiAdjListNetwork<ElemType, WeightType>:eleteArc(int v1, int v2) . ~8 P+ n0 g( s$ k{ . x# c( U* V7 d. r2 R* r: F7 F- `. M8 l5 h0 L8 q, U
MultiAdjListNetworkArc<WeightType>* p, * q,*r; 0 P: v* s4 F& X! \' v" _+ g5 q8 t if (v1 < 0 || v1 >= vexNum) % H" {4 k0 J" S% P' T! Y throw Error("v1不合法!");6 d* m6 J1 X- ^, D$ ~
if (v2 < 0 || v2 >= vexNum). K/ A1 a" C2 g) u% n
throw Error("v2不合法!");2 c2 s' x1 q/ L! A, E7 i( |7 ?: B
if (v1 == v2) : y1 t: N' K% K throw Error("v1不能等于v2!");4 R! A3 s: c( D+ H9 U0 Q+ q
2 R6 o) Z6 ^) v) J p = vexTable[v1].firstarc;* L! M. R% ^! ~0 [$ E$ R
while (p != NULL && p->adjVex2!= v2&&p->adjVex1!=v2)! Y/ X* |: K4 u3 v s$ u3 _" z
{ 3 v# s/ u2 A+ ]# V. ?/ h: T8 G- P q = p; ; N. ~; Y& }0 B6 L% k( N$ h p = NextArc(v1,p); # X% n5 x5 e" t8 R7 V b, W }//找到要删除的边结点p及其前一结点q! Y* U# ], u1 Y5 ~- A$ {) m
0 r8 Y5 h- G! d* e% a if (p != NULL)//找到v1-v2的边& g" e4 e5 J U6 a# c8 _( h# w: ]8 ]- H
{ + K% Z9 w l$ s2 t! U% }1 g. x r=LastArc(v2,p); % v5 Z, s) R# H- v if (vexTable[v1].firstarc == p)//第一条边,q此时为NULL l5 G: P/ }( H0 i. i1 M5 ]- O/ @
if(p->adjVex2==v2)8 J4 t- I) ?7 b- K: [
vexTable[v1].firstarc = p->nextarc1;2 L/ y( H; I A" ^1 d p7 o
else vexTable[v1].firstarc=p->nextarc2; " t+ v# f* H, B, z else//不是第一条边7 @4 ?4 L) D+ F
{ 9 F% `9 ]* ?. \" z if(q->adjVex1==v1)9 o; \3 E0 j; o1 ~" w8 x
q->nextarc1 = NextArc(v1,p);, @7 `) ?- X, o; j" F7 a; z
else! n( q$ L( Z* h, J; \; r+ |- o1 n2 L
q->nextarc2=NextArc(v1,p); 5 o1 v: Y: y+ A% @1 h& S% B* O5 k# q/ M# i _! _4 V. _, A
}1 N( D7 x& ~- r+ b
if(r==NULL) 6 x: Q% P9 @- N& q if(p->adjVex2==v2) 7 P: u+ B5 J- u. ~9 H: q# [ vexTable[v2].firstarc = p->nextarc2; 2 a' J& z; i# a+ z. n8 s6 J: f else vexTable[v2].firstarc=p->nextarc1; : O. s" L" W# J* c; u+ a else% i$ G: Z2 V( l
{ ) W- L8 V; X9 f& R, \0 y if(r->adjVex2==v2) 5 i& e, A) c, h& x1 x3 L. ? r->nextarc2 = NextArc(v2,p);1 ]9 C4 r+ l1 V G) H+ ^* [
else 9 N$ _- a" N d r->nextarc1=NextArc(v2,p); & a# V6 N! T g+ O7 Q1 k }& a9 _6 I5 \" J/ E
delete p;" `2 I9 b3 _; B; ^' l
arcNum--;; o: _! t J: v7 ~1 F0 ^ u1 J0 O
}8 H F6 v- o1 \
5 A$ ^, J) }* _$ e/ i& C
} 4 I$ G# Y! L" Mtemplate<class ElemType, class WeightType> void ; E; E* Z9 p4 n- c# Q6 dMultiAdjListNetwork<ElemType, WeightType>:eleteVex(const ElemType& d) 3 C0 k; W3 f8 n{. R# ?8 {% r5 v& ?
int v;% h4 u/ Z6 B, A" ^9 ?+ j
MultiAdjListNetworkArc<WeightType>* p;7 y) T3 g$ `" I% h
for (v = 0; v < vexNum; v++)//找到d对应顶点 , U! j! f% Z" j" U3 g if (vexTable[v].data == d), H# x0 O; y; m4 }$ e: K6 `
break; % ?+ A% K8 @" N. H+ U: `1 @ if(v==vexNum) 1 K. Y% h+ p, ^2 ~5 j throw Error("图中不存在要删除的顶点!"); ( w% C! U2 w f$ R1 Y8 E( e+ x6 V* R) r, j) V! l/ V5 w
for (int u = 0; u < vexNum; u++)//删除与d相连的边 , E* J; B1 B4 k R* y) | if (u != v) t; Y, Y; Y$ h7 t; O
{ # n& f) [ j/ i DeleteArc(u, v);; |' [) J& y9 V, G$ K
} # w6 b T; j' P' R: |5 ]' h( @ R vexTable[v].firstarc=NULL;* F; q l- b5 m
# l9 ]/ g3 b! s4 d' q) Y5 N# f6 V! j
vexNum--;///将原来的vexTable[vexNum-1]即最后一个节点移动到原来v的位置 l# ~( c2 ~3 ^4 M
vexTable[v].data = vexTable[vexNum].data;* j% ]. N* V! d/ f( |3 A& y6 g0 O
vexTable[v].firstarc = vexTable[vexNum].firstarc; % ` W9 q" E% C9 l$ f& o vexTable[vexNum].firstarc = NULL; # C: b8 S+ S4 E' n4 m tag[v] = tag[vexNum]; 5 u6 w$ |( ^3 m4 a$ H //原来与最后一个顶点相连的边改为与v相连( l; R3 d5 b1 W% k2 h
for (int u = 0; u < vexNum; u++)8 c9 f" q1 k- J7 @1 H" f3 f0 \
{/ A' B' t+ C7 c: @* \
if (u != v) - h; E( {8 d5 X: E2 {8 I" i! B, Y {8 ]8 x, }2 r1 z2 f
p = vexTable.firstarc;1 Y S. B$ l, u2 U
while (p)8 x, ~# `( g9 o' Q5 P8 t( L
{! W0 {0 q% k- c& f" _1 l' B5 w
if (p->adjVex1==vexNum)3 ]) [* i) s$ P$ J" O% j
p->adjVex1= v; 3 q) m7 R1 `6 w3 {. d else if(p->adjVex2==vexNum) : b' K' F( ~9 V1 }" O p->adjVex2=v;9 S8 s8 P4 ~' G8 S1 ?3 j1 c3 z2 o. M0 G
p = NextArc(u,p);. |8 }) P, W$ V% k
} ( _- `# b, ~! u6 B6 z) m }: V% \9 g5 e2 b. t; L
}) B. n& c3 V+ _! q8 h, P) W+ {1 T! C
} $ @: X- C! r% C5 ^2 b6 X) `///深度优先遍历* ?$ A# @$ v( U/ A
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS1(const int v) % w/ i7 ^, Q, y{ ! U1 Z3 e4 Q7 `1 `5 _6 r/ Z tag[v]=1;4 o+ e8 Q* x" H) f4 B( f8 Z
cout<<setw(3)<<vexTable[v].data;$ ^4 G8 d) S u) E/ W
MultiAdjListNetworkArc<WeightType> *p;1 T; b$ v) W/ a
p=vexTable[v].firstarc; , R& ?" u6 p1 \1 p while(p) O; L' } f" g- r n# S- F: j2 r {% K' K1 i7 [3 y: R# C' a
if(tag[p->adjVex1]==0)7 N% n+ X: m, P
DFS1(p->adjVex1);) h7 k" H6 x" T/ ^# L6 e
else if(tag[p->adjVex2]==0) 3 z! N' B2 r8 ~2 s3 Z- R DFS1(p->adjVex2);# j) w: V: I! L- c7 B
p=NextArc(v,p); ' n2 D( ?. h( t6 b6 L2 u2 L- ^4 c }2 e5 o2 z! C0 u" l8 I6 n
} s4 [3 c c& I
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS1Traverse() ; a8 x2 X2 r/ a) K7 w{. Y- m: K6 r7 p- M
for(int i=0; i<vexNum; i++); ^6 p, k/ l/ k+ z! S1 f
tag=0;! {3 w4 m0 u6 ~ [/ @
for(int v=0; v<vexNum; v++)+ z7 I- D, y' d6 n
{/ _& h, U7 `8 V9 p; _$ X' ^8 k m) Z
if(tag[v]==0)* N% B( Z6 Q& `
DFS1(v);7 y4 k+ ]0 b4 c; D/ H
} 3 i- N- t" J2 R' z' H* S} ; @5 J, c2 ^+ h% U4 n, }9 G4 q- D6 @template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS2() ; u ?8 u; t& V0 Y; H' V$ y{ 4 {; D2 ~) B. S) i9 [ stack<int> s;/ u0 x" D* Z. j& a; R# T
int tmp;- Q! ?: }8 f& W
MultiAdjListNetworkArc<WeightType> *p,*q; , O" f5 D) b: _9 a for(int i=0; i<vexNum; i++)4 J: \8 \( m# U+ K @- D
tag=0; $ w! o3 x f0 f3 i6 R; s- m for(int i=0; i<vexNum; i++)& Z. ?& g5 y4 J6 X# Z. B
{6 L0 d, s; }+ H8 @ Q' ~
tmp=i;3 i! q# i( u% v6 d/ r. j W) c" `
while(tag[tmp]==0||!s.empty()) / Y v" m# z/ Z+ @0 f( _3 \! j { + q% J7 D1 y& W+ X3 m$ p p=vexTable[tmp].firstarc; , q3 z3 @0 l+ ?: i5 A! Y+ ? while(tag[tmp]==0) 2 m' Z, e3 n" ^. c {) F+ P& g- x% y \ i2 M
s.push(tmp);" F0 e: s# Q" z: o1 @1 X" j; l" N& g
cout<<setw(3)<<vexTable[tmp].data; 9 G" O ?2 D" P0 {) _% i' _ tag[tmp]=1;: K: I4 u0 M0 I% _% J
p=vexTable[tmp].firstarc;& a; U( |) D% ?, @" {0 n& h6 t% p: C0 x
if(p==NULL) break;///该顶点没有边,连通分支结束(1个点)先出栈再跳出循环进入for6 ~" L/ t' \, `" o& m% J c
tmp=(p->adjVex1==tmp?p->adjVex2:p->adjVex1);. K& ~$ ]! z& e$ O9 i
//cout<<" 1st tmp="<<tmp<<endl; 4 R- Y4 v! Q% E& b }8 D7 f$ R" c! t
if(!s.empty()) / v& q3 K& j; a9 c# e& @+ O9 Y { 3 T. s4 J( _$ K tmp=s.top(); ! E6 a& `3 R: g* e' K6 i, H s.pop(); . T" ?( n+ t% S% o q=vexTable[tmp].firstarc;4 u5 W" r1 D! C$ l0 s# @# V
int t=tmp; - P; V. Y5 _8 T c8 K J: Z5 c while(q&&tag[tmp]!=0)5 H2 |" ?; ~2 J' K) Q
{( I8 O7 c3 l' q8 Y0 H+ F9 v7 B
tmp=(q->adjVex1==t?q->adjVex2:q->adjVex1); + v; [7 j- o4 ?, l5 S7 E( M //cout<<" 2nd tmp="<<tmp<<endl;+ Z" H; S9 i& [
q=NextArc(t,q);; ^& l# c7 Q6 |8 O! S
} 0 [( k8 T) e4 l/ ?; c if(tag[tmp]==0)( A# V& [, y' s# K3 }& n
s.push(t);: p: |$ \1 V/ |; B+ d9 m* I8 E, k8 S
///1、对应上面连通分支只有1个点的情况 2 ]; M3 J& ?3 m" T$ _% w: J6 c* ` ///2、t上的点都被访问过,此时tmp是t相连的最后一个点,用于跳过上面while,再次进行出栈( W9 |! c/ }9 I% f# o
///tmp要么等于找到的第一个未访问节点, 1 ~! q1 \- E+ |: k ///要么等于与t相连最后一个点(已被访问过) / ^; z: V1 Q" M! u9 M5 F& `) N ///当连通图只有一个节点时,这时tmp=这个已访问的孤立节点 1 }' S5 ~" v3 ?4 E- t! F; @ }& b1 t+ B8 p; z0 s5 x. h2 `
}2 b$ J ^8 S# T, Z- i# l# ~
} ( l' E; s/ W4 j& ?4 a- C}# A9 F3 s- x! e5 r- N4 W$ b
//从顶点v出发的一个顶点u,返回v通往的下一个顶点;如果没有其它分支或者已经是最后一个连通点,返回-1;如果要取第一个顶点传入-1 / Z* z: ^3 V" ftemplate<class ElemType, class WeightType> int& d: }0 k1 u" d$ j
MultiAdjListNetwork<ElemType, WeightType>::GetAdjVex(int head,int pre) & C* y! a- k! r1 }{# ~1 A' B" y6 [: h$ J' Y. u/ c$ c
if(head==pre) 0 ?, w# _0 _& b! Y4 Y: q return -1; ; `. n( K W2 B- C3 E1 N+ ?) X! o g l' E6 |/ f9 ?8 d# C" ~ }
MultiAdjListNetworkArc<WeightType> *p; 9 H% G7 I$ H, c. J p=vexTable[head].firstarc;" B7 }, u z5 K, u! v
if(pre==-1&&p!=NULL) % v: r7 d; {2 ^7 [ return p->adjVex1==head?p->adjVex2:p->adjVex1; : t2 E, |4 Z& ~: X- d" R } //pre!=-1&&p!=NULL6 G8 q3 T+ y) q+ c$ ~. B
while(p!=NULL) + `' R' R$ D$ `) K: d3 X, d. B# B% q4 _ {$ W( g; q8 }( F1 |
if(p->adjVex1==head && p->adjVex2!=pre) + U. t; {: J$ P. \7 f% I8 e p=p->nextarc1;5 F5 [0 y! V7 o0 ^4 t0 m
else if(p->adjVex2==head && p->adjVex1!=pre)1 z4 e" ]8 A. Y1 l' i4 Q- c
p=p->nextarc2;' w1 x3 h$ s8 j2 v0 \+ \
else if(p->adjVex1==head && p->adjVex2==pre) " A* [( w, k) g0 E/ Z- I8 y3 B7 L { ! ~) W1 G( E: Y7 @7 @3 D p=p->nextarc1;. b1 N! u) \1 S
break;% K3 R/ h# D5 |8 t$ I% Y0 W; y: i/ y
} 7 f& I6 x/ X! D5 H else if(p->adjVex2==head && p->adjVex1==pre) $ [- p) m6 d6 y0 `6 w3 V& j* o { 2 D3 M5 N! Z( O7 W# w e" P p=p->nextarc2;6 V9 ` G& b0 j% ]# @$ B
break; ; n, b% ?% |7 { b3 ]. b2 V4 N } & C2 w) {3 k0 _) \' J5 |/ a6 S" ?1 H5 a }; v$ b; C; k. L+ _0 n
if(p!=NULL)' ?5 s- a& }/ Z& v) T
{$ z$ \: h8 y b0 i, ^8 i
return p->adjVex1==head?p->adjVex2:p->adjVex1;6 y6 t2 C+ X: d% {
}, f; I7 s: R0 ?" ]
else " E* U5 R& t) s( _( ] return -1;4 F4 E8 c# p7 T; T% u
} - s6 n6 L- l* i) t9 P0 ^ T. b/ I% T+ i9 Q* @$ u$ g
: F5 K! P6 U% X; gtemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS3() / r+ \+ P, Y) X0 D- b$ D{7 W; K* z" t7 i W4 G/ O
stack<int> s; 4 U2 E6 d7 q( q" u; T# H" @ int p,cur,pre; 1 Y8 e* A9 v% `& b9 k0 E: P5 M5 g //MultiAdjListNetworkArc<WeightType> *p,*q; + j) c8 N* v4 k1 U for(int i=0; i<vexNum; i++) tag=0;//初始化, [: Q5 q9 S6 h
) h- W" P L* B- v5 h/ I
for(int i=0; i<vexNum; i++)# _6 \% J% s" f4 b* B
{ V C1 J6 z2 Y# H! S- x
cur=i;pre=-1; 8 f$ S8 ^# d! q' t+ C8 X while(tag[cur]==0||!s.empty()) 4 g+ J" W* c- V/ u6 V, F" i {* j: Q; ]% b0 ?2 j9 q5 G4 x
while(tag[cur]==0)! L; V7 ]: ^- U1 h S: [
{' p' T" n1 K6 h
cout<<vexTable[cur].data<<" ";. t( D2 n6 R% P" S
s.push(cur); 2 ~, I+ Q. j9 R) \# _. e tag[cur]=1;& |9 P6 ~0 g! Q F3 B7 @. P2 k
//初次访问,标记入栈 3 l# Q6 v; d% ~" w& s. l( D! T+ J; Q7 R3 b& k
p=GetAdjVex(cur,pre);//p是cur的连通顶点9 C3 B2 G4 J: M
if(p==-1)% G1 W, `2 q; J+ O- K
{' T! z0 z( g1 t+ `- Q
pre=cur;s.pop(); 1 |3 g2 j {. F1 J2 k) f$ k! h! w) k6 T2 P break; " e [/ J/ p# _# Q0 e0 c9 X } & I+ G" v% y2 \+ N, e0 ?# \: i+ ] else3 }. \' s, R& T3 n- a
{7 F$ i. M( i% d1 J- n8 C5 h0 J
pre=cur; 7 ^; W @' I; O$ P cur=p; ; Z1 Z, z% r% ?6 ?7 H2 o }9 N! M A6 \3 T0 N0 H f( Y: R
; t! Q1 r9 A+ e3 k5 ]9 H } ! q; t" e+ G0 L3 _ while(!s.empty()) 5 V. t, l* J) S* U c( _ {( ^9 A1 y' ?; C+ ^; S7 r5 F: Y3 g
cur=s.top();: ^. p0 W; M8 M3 m& Q; H$ M
p=GetAdjVex(cur,pre); 2 ~! ~. K6 R3 x8 p; k if(tag[p]==0)" D) L) p7 C" m# Y* R
{ : T3 V$ K {! q, G" q, o pre=cur;1 }- D' W) F: F* l8 l) l5 }
cur=p; & Q, ~; T0 N7 M2 ?, ^; J, S% ]* | break; . ~9 q( E# ?1 P7 x0 d. }/ z/ g }; t, Y! l. c. `% D7 @* S& ]1 R
else+ s2 E# |/ V' l/ r# [/ N! O$ t5 W
{1 F9 @5 V0 b8 J- X9 |! O
pre=s.top();: _! _0 F8 f3 ^6 X, h$ _4 q1 s1 B
s.pop(); / v6 W$ F( o% ? ^4 `0 P- w- @ }3 X2 e% C2 T8 M! ~
& d8 X$ A [4 p" H( p1 E4 f
} l+ T! V! B, x% ^; S
7 n- K5 p9 p8 O; K% e
} f: \' q2 b/ T/ u: |5 f } % _+ X- ~) U) n: i! d/ C# M}: E! q @3 k9 y( X' ^* d
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>::BFS()9 a6 i1 o0 B7 P9 ^6 F
{ 3 J- T: j3 _' L9 a, X$ {1 E2 Q. _ for(int i=0; i<vexNum; i++), D6 @. t8 A8 L+ C& k2 m
tag=0;+ x; J* R: _: N! D. n7 n
queue<int> q; ( N8 a% z% F. e6 }6 F& h, X1 t int tmp,t; 3 Q: E* C% l/ q1 v) ~* N5 x' [ MultiAdjListNetworkArc<WeightType> *p; 8 ?( e% c: c, |8 n _0 R k- Q for(int i=0; i<vexNum; i++)5 Z1 u' ^# d2 {. d! \ _& H$ |
{! |+ v; E+ g' i
if(tag==0) 5 ]: l3 W* U& P/ d: B0 X { ) t O! Y% J7 D& A! ?7 j tag=1;- _9 f- B3 R1 G( m. ^
q.push(i); 8 v' K( h. [6 L9 r' e cout<<setw(3)<<vexTable.data; d) v( x. S& h( D' k: o, w
}4 X- R0 f6 V- y' J: Z% u" A8 \
while(!q.empty())) ?1 Z; s: w2 m- @% v- T
{ & P0 x+ H) E H; n7 L2 }3 A, s s tmp=q.front();/ N+ b& m" R6 C- ^+ V: g
q.pop(); : L1 C+ P( J( e9 I+ ?" W$ N p=vexTable[tmp].firstarc;1 A; b( j* _2 y7 |: u2 u
while(p!=NULL)* L% B/ F0 I! K& P, }
{( Y& \9 X) f) x, U h& s
t=(p->adjVex1==tmp?p->adjVex2:p->adjVex1); 8 k% C: |9 i l, @0 X- u if(tag[t]==0) $ Q9 n9 M( l, h# t" N" `+ S {0 y$ x) a4 N0 q3 I( C4 Y: h
cout<<setw(3)<<vexTable[t].data; , D5 L2 p0 q. V- L+ W8 m5 F tag[t]=1; ; n% ~1 m; d" a" [ q.push(t);- ]0 o9 X$ O+ h2 ~0 t
}0 {4 { U6 {* H. o% }
p=NextArc(tmp,p);/ }1 F0 k; n) J1 S
}+ F3 Y4 x' {" g) g/ t
} 1 j: L* U4 E3 \/ k3 j! ?- X( l+ g/ t }0 }# n ]4 @0 h2 @# ]7 g" ~3 {7 W) M
} 3 Z/ f% c: N$ Z& ^7 }' A* e( ttemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>::Show() , L' O, T# p, m{ 9 D5 y# u+ T- w. _: l! J: O% { MultiAdjListNetworkArc<WeightType> *p; - ?: o/ V, L% s2 v( o* ~ cout << "无向图有" << vexNum << "个点,分别为:"; ! X) k% q8 W$ W' s! U( E u for (int i = 0; i < vexNum; i++) 9 P* G% f" {- `( j f( Q6 ~" [) ] cout << vexTable.data << " ";2 Q9 e" {4 @ g) Y
cout << endl;( a% ?2 ?% i: j
cout << "无向图有" << arcNum << "条边"<<endl; 1 d& M4 K9 R3 G0 ^2 o for (int i = 0; i < vexNum; i++) 1 Q# A& u u. o+ L) E* ?' | { # }. ?) O; X( _7 R/ m. U p cout<<"和" << vexTable.data << "有关的边:"; 2 k' }' z# X/ O: K p = vexTable.firstarc; $ m' P H2 Y, w% j* G. } while (p != NULL) 8 ~8 s9 g& E) Q2 K) L- o# O# Z" [ { 4 ]6 w, v! S& U2 ? cout << vexTable[p->adjVex1].data << "<--"<<p->weight<<"-->" << vexTable[p->adjVex2].data << ","; & C+ u% G a3 y( w- v p=NextArc(i,p); Z% j4 Q/ d& t o) [& h) }. P }& r' p' E4 b& G& z( E
cout << endl;( ~3 |( ?/ h1 h( ?% X, e% T
} : [2 a- O) k- q} ( G9 X, v& r9 G& a" L9 s* b7 L5 C. }! W9 e
7 X% o3 \" H/ x% v; ^# b* s1 v* u" c
邻接多重表与邻接表的对比: y8 Q7 v% {! H; \$ l2 B
" g& M! _$ F( ?+ l9 `3 p- _ T0 i邻接表链接! O4 D5 d8 M# h' f% }2 b
在无向图的邻接多重表中,所需存储空间与表示无向图的邻接表相同。 ' p7 I4 ^( J) Z在无向图的应用中,如果更加关注图的顶点,那么邻接表是不错的选择,但如果我们更关注边的操作,比如对已访问过的边做标记,删除某一条边等操作,那就意味着需要找到这条边的两个边表结点进行操作,若要删除某条边,需要对邻接表结构中相关的两个结点进行删除,显然这是比较繁琐的。 9 v( A& l/ C. c' O$ d k" J9 P为了提高在无向图中操作顶点的效率,又有了邻接多重表的存储结构。邻接多重表与邻接表的区别在于,同一条边,在邻接多重表中要用两个结点表示,而在邻接表中只需要一个结点。此外,邻接多重表中增加了标志域用以标记该条边是否被搜索过,避免了同一条边的重复搜索。% C9 |$ y! f( b; l7 X
———————————————— 8 I8 h- v5 z" ]1 ~版权声明:本文为CSDN博主「lseaJK」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 D4 y0 F9 m; S! t0 D+ f
原文链接:https://blog.csdn.net/qq_43413403/article/details/105766958 , Y9 L& ]/ z( \! A9 N6 A& E3 [8 h& A
8 f0 q; Q6 t7 E2 I& d7 Y U9 Z - v. o' L" z/ d% Q' Z8 P |4 k6 p( s% u/ E) N9 W7 _# ]
————————————————2 a4 n' Q# ]- z6 Y. M7 a
版权声明:本文为CSDN博主「lseaJK」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 X N' A9 L* G: [3 T. T; z1 C" F
原文链接:https://blog.csdn.net/qq_43413403/article/details/105766958 * Z( N' ]2 o" }% n4 h" p$ r, [6 i$ r