, k! \! ^+ Z' y/ [ ( e* u+ x1 j7 f3 |" E) i3 b2 m4 x p = vexTable[v1].firstarc; ( w+ F, K( h: H5 K6 ^- H while(p) 7 R+ F, \) A6 @$ i0 ? { 1 j& h5 f% U; g8 z% Q if(p->adjVex1==v2||p->adjVex2==v2)//边已经在顶点的邻接边中, W5 h( A; x3 |+ W. x0 [
{ ; K4 h: X" a Y5 L% b b if(p->weight!=w)" ?9 |! F0 z" _& _. X# x& k
p->weight=w;8 F) f7 q# c& E0 p4 C7 i
return;5 K# \0 e; ^% ^' i" o7 N( k
}" d& {" _& D1 X- }8 I
1 h9 [3 E7 k' \5 X* x/ b+ D& | p=NextArc(v1,p);/ C3 d6 r' u/ B" ]+ F4 l: g! S! N- }
} % L1 y& [- {+ I* p8 X" `$ u p = vexTable[v1].firstarc;! `7 v% L' I! W& _( g. x3 r( B
q = vexTable[v2].firstarc;& \; ?* t8 F. o6 a3 {; Q
vexTable[v1].firstarc = new MultiAdjListNetworkArc<WeightType>(v1,v2, w, p,q);//头插法* m3 J% q9 x7 x' p( b
vexTable[v2].firstarc =vexTable[v1].firstarc; 8 S H# z# p) ~ arcNum++; 3 f$ K f Z# n3 c: |: ~: y8 r, w}2 {; S7 i/ }" g4 ? V- b0 V. m. v
( U6 Y0 ^3 N' f9 O0 i8 L- Utemplate<class ElemType, class WeightType> + a$ t( Z: M* I$ I0 ~% s6 Dvoid MultiAdjListNetwork<ElemType, WeightType>:eleteArc(int v1, int v2)7 F4 M4 h, g; ^* F2 |
{ + C$ Y# F8 J, k1 y* D( e / E1 S: ^8 T$ A1 c. G% F MultiAdjListNetworkArc<WeightType>* p, * q,*r;. |: t# K0 m+ b
if (v1 < 0 || v1 >= vexNum)( S3 T8 ], z: c
throw Error("v1不合法!");5 K* ^" p. ^+ i7 }' p7 O/ i" H
if (v2 < 0 || v2 >= vexNum)2 g' Q4 _" v d2 t
throw Error("v2不合法!"); 3 s5 q% {5 y3 c' q/ q if (v1 == v2)2 u+ m+ h W+ I. q8 A3 I
throw Error("v1不能等于v2!"); 6 K x A# M& G/ @2 O+ E5 B4 d& z1 R3 m C- ^- N V
p = vexTable[v1].firstarc;9 x6 e3 o# l1 j
while (p != NULL && p->adjVex2!= v2&&p->adjVex1!=v2)) r! C/ n% f' b8 U
{ 9 S# b) f& N! ~* ]1 ^ q = p;( v+ q4 o& x. ]$ W3 v8 X+ |
p = NextArc(v1,p); & `+ E7 w/ F3 | }9 F }//找到要删除的边结点p及其前一结点q 4 K4 s8 q3 k/ N' X6 }# e! K& c5 ?- u# M6 v5 Y& G# h* d
if (p != NULL)//找到v1-v2的边% V, C9 d# b, T: X/ R
{& ]% u/ B' X' Y @
r=LastArc(v2,p);: g6 v! {- D) \* z' J3 l \; P
if (vexTable[v1].firstarc == p)//第一条边,q此时为NULL % G* T! R; g4 w+ _8 J0 F! m if(p->adjVex2==v2)6 d0 o x9 k7 ?! m
vexTable[v1].firstarc = p->nextarc1;* q( r7 J& ` t, v* ~
else vexTable[v1].firstarc=p->nextarc2;' t+ T) K5 l8 e& ~
else//不是第一条边5 \5 ^) f9 U/ N$ n9 L
{$ s" ~$ g) z4 u* r0 v
if(q->adjVex1==v1)2 \4 h/ K. @; K# e/ D2 s
q->nextarc1 = NextArc(v1,p); # q1 Z) d& f* `4 h# s3 ?5 A else! J/ t1 n1 C; Y" V2 _; K
q->nextarc2=NextArc(v1,p);& Z L6 L5 e& O$ W
, C4 P7 B3 p5 h. z# M } 7 Q" B! V& z: {% l if(r==NULL) ) o- S/ _) s4 {, a, B if(p->adjVex2==v2)4 {6 H/ }# ^) C0 k/ N1 Q' @9 j. k
vexTable[v2].firstarc = p->nextarc2;; S3 x2 |( o& ?
else vexTable[v2].firstarc=p->nextarc1; ) r- G1 W# j$ Z9 n2 Y; ] else 2 b3 U1 F* N& i/ N {4 V4 x% W4 P0 }# H& ~/ C
if(r->adjVex2==v2) 9 {3 o( @9 y P6 {0 }3 d/ o r->nextarc2 = NextArc(v2,p); 5 q/ L3 c6 g. p/ p, \* { else " l8 ?# c# `5 I+ k r->nextarc1=NextArc(v2,p); ; D( [& Y5 \8 ~4 H- X( U }. s# e4 P! v% b! D
delete p; 2 N3 n' P! p& t5 O1 X arcNum--; 5 G) m7 G: k- G! p }5 \% x' U1 t; O* O/ i. M
& t8 _' R& s5 I}, P$ g) p) z& ~0 m, i
template<class ElemType, class WeightType> void 9 q; V& D `/ i3 @MultiAdjListNetwork<ElemType, WeightType>:eleteVex(const ElemType& d)+ _) t' G3 w5 A0 _/ l
{ : x, j& _ J3 p int v; ; t" J8 [2 g0 r2 w( P; ` MultiAdjListNetworkArc<WeightType>* p; - V2 b2 W# d9 v5 {" g for (v = 0; v < vexNum; v++)//找到d对应顶点 ' b2 s+ j- k! U5 p5 g3 } if (vexTable[v].data == d) 8 B6 z( I# G: u7 Y4 g break;+ M0 \7 |: y5 g& E: ^, ~/ ]/ [
if(v==vexNum)2 @6 P1 g0 {2 P% s* n6 I, \
throw Error("图中不存在要删除的顶点!");& l- e1 t" t. P1 }% _! `
6 ~( T8 x3 k& ] for (int u = 0; u < vexNum; u++)//删除与d相连的边 v A6 X! H3 T4 L% L
if (u != v) 6 b0 j* K- \5 z' D/ P+ ` { {1 {, x4 o I" G7 q A w/ I
DeleteArc(u, v);# G" y( }! Z8 X
}( k) W h( i# v0 ~% t. k# d+ l
vexTable[v].firstarc=NULL; + a4 `- o) E* }9 B7 B 9 }5 b- r/ @+ w# f vexNum--;///将原来的vexTable[vexNum-1]即最后一个节点移动到原来v的位置) |. Z; v$ ~4 L# K
vexTable[v].data = vexTable[vexNum].data; ! T2 P0 M: c# z: o4 N vexTable[v].firstarc = vexTable[vexNum].firstarc;0 o% {; W* b6 |5 o
vexTable[vexNum].firstarc = NULL;0 m: ^2 h' L5 b; s* M# A7 f
tag[v] = tag[vexNum]; ; n% W1 y+ O. I# @+ X //原来与最后一个顶点相连的边改为与v相连 e3 q$ y7 B& }# }" z: U for (int u = 0; u < vexNum; u++) 5 S. @" P8 M, a- ` }* ]6 |2 a {0 j: x+ N! a8 Z# c* ^1 ?- C
if (u != v)9 E4 ~. Y% W9 l3 ^9 _& [
{ & j1 T- Y+ @9 G5 U9 u p = vexTable.firstarc; ' u: G [( N9 b& A4 y% X1 K while (p) $ V* L% i' y5 L" s% C { : f' `; h) [2 f: G if (p->adjVex1==vexNum), E: U- }" a5 C4 N" q* J
p->adjVex1= v; , r7 ^) r% y3 }1 f0 @) {" W else if(p->adjVex2==vexNum)! N6 ?; v& ^* i' t( y- n
p->adjVex2=v;( t/ A: _! k' H$ j U8 k+ o7 ~
p = NextArc(u,p); 4 f( a8 o3 D/ L# D/ A. c }4 n1 k4 u$ Z7 `$ O
}) Y9 |& S) r3 q& M; D
} 0 `* ]. @& [- G) f0 J} ' E2 Q+ ]$ ~' i///深度优先遍历7 z; [! w8 g$ D6 y) w
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS1(const int v)2 F, a8 y4 G4 w# F- J$ p5 | j( k
{ ) g- O2 q# Z9 E& W# T9 m tag[v]=1;5 F' p s: [+ f1 X( ~) R
cout<<setw(3)<<vexTable[v].data; 9 o' ?& ?$ o/ a- l8 \$ p/ e MultiAdjListNetworkArc<WeightType> *p;! F# ]: D* s$ E
p=vexTable[v].firstarc; 6 A& |! \6 ^: ~+ r while(p); \) c( |/ W/ {! g* s( M
{ : U6 n+ f3 e0 g( } if(tag[p->adjVex1]==0)( Z+ ~5 A/ C" ?% @* [: ?
DFS1(p->adjVex1); $ J9 s0 S0 I& Y$ {' |9 E$ x0 i g else if(tag[p->adjVex2]==0) . Q- ]- ?& ?" D+ T DFS1(p->adjVex2);+ n$ {: i! ?5 a( f) F
p=NextArc(v,p); " @. _; G0 |6 }+ k }& m% S, T! l Q2 T4 E: O: |
} * N8 E; D' R; l; vtemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS1Traverse()- _+ y/ t5 H/ J, X+ `
{ ) ]+ I' y; {3 F7 e* j- l% q for(int i=0; i<vexNum; i++)6 q4 P9 F ~0 f- m
tag=0;$ c* c. v j' X" K$ j
for(int v=0; v<vexNum; v++)6 C$ D5 _) `( N% y9 V
{# U5 A) w! v0 K$ x
if(tag[v]==0): o, @3 m: r; t$ x4 y ?
DFS1(v); % ~% w! _; G, k6 t& ^: H* T6 [ } $ F, Y1 y( H1 |} " i1 q( B3 q9 L! n6 g* ytemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS2(), ^& K! J: i! m" }% E- R
{7 t' \- |. P4 ]5 q/ R
stack<int> s; 5 |" n: p8 J! \ int tmp;8 t( j6 F }' m3 p* B4 X
MultiAdjListNetworkArc<WeightType> *p,*q; 6 D7 \, z5 ~1 b for(int i=0; i<vexNum; i++) + e1 `( f5 s& I, I2 y+ i( k8 I tag=0; N' {" @9 c9 ~/ U' A, m
for(int i=0; i<vexNum; i++)( v( I* s, V/ D4 i
{ 8 {% B$ Y6 d4 S8 ]8 q1 N: t* e8 ` tmp=i; ; _+ r& M, K" J$ o while(tag[tmp]==0||!s.empty()) , {5 o; a# j* I# n { 7 d8 x) O# O* ] p=vexTable[tmp].firstarc; % C' [1 R6 N" z/ f0 o: J while(tag[tmp]==0)4 k8 j2 Y. R4 j) L, w
{& j4 i3 Q1 m; R3 k; q( P2 U. P5 l3 P
s.push(tmp);0 T: r# e& P. r: m# F; p, Q* J& p
cout<<setw(3)<<vexTable[tmp].data;" j1 G% d, Y8 H7 W) v
tag[tmp]=1;9 g" ~2 Z5 U7 L* }. O
p=vexTable[tmp].firstarc;% x. E1 e& [. d7 ]3 q" w
if(p==NULL) break;///该顶点没有边,连通分支结束(1个点)先出栈再跳出循环进入for+ U) U+ }% {# H
tmp=(p->adjVex1==tmp?p->adjVex2:p->adjVex1);3 J) J" Y; D/ a- ?2 h, ~
//cout<<" 1st tmp="<<tmp<<endl; - u: \: w; ~% F+ H/ I+ Y5 N }' H' x4 P) i* P
if(!s.empty()) $ Q1 ?& L8 Q" T9 d) z+ O {) g. Z6 e" w6 F6 _( C* ]
tmp=s.top();0 U9 I+ G3 _9 D; |6 s! z
s.pop(); l4 d O2 w) z8 ^5 z
q=vexTable[tmp].firstarc; 5 u3 d d; D" t int t=tmp;; I) o% I4 H+ x/ _" t
while(q&&tag[tmp]!=0)$ C1 x; }, Q4 b% a( W
{ $ [5 x, k; G' r! M( o$ g tmp=(q->adjVex1==t?q->adjVex2:q->adjVex1);0 z: N' U% f5 f v# v
//cout<<" 2nd tmp="<<tmp<<endl; 8 l/ L% B v6 w( S q=NextArc(t,q);' G6 j- X) o# [) }: c5 Y& g
} 4 E% |: z0 ~8 }- c if(tag[tmp]==0) i1 R$ e! l1 I0 k1 q
s.push(t);/ l( Z& X' g# G/ W' ` l
///1、对应上面连通分支只有1个点的情况; [* d& K: W4 p6 L9 N; l0 |
///2、t上的点都被访问过,此时tmp是t相连的最后一个点,用于跳过上面while,再次进行出栈0 z7 J! i0 Y3 K, m
///tmp要么等于找到的第一个未访问节点,: s. T7 m- H8 v3 X0 M7 r
///要么等于与t相连最后一个点(已被访问过) ; K2 v7 G( s) [1 J+ { ///当连通图只有一个节点时,这时tmp=这个已访问的孤立节点 + y z% G- J, l% {# W ~ }1 x& T% t* s0 h$ b) N) e
}8 ~, @( O5 Q9 B. B
} 8 m' }& N" T2 O# I+ c}. ?# }% \& a# V' {3 M; d4 ?1 s. z
//从顶点v出发的一个顶点u,返回v通往的下一个顶点;如果没有其它分支或者已经是最后一个连通点,返回-1;如果要取第一个顶点传入-11 R; g1 i" @ h: b
template<class ElemType, class WeightType> int # w' Q$ ^/ Y# S6 JMultiAdjListNetwork<ElemType, WeightType>::GetAdjVex(int head,int pre)# D8 P9 D- {6 o3 W, h2 _; E
{ - y& Y/ T' ?9 X* S! B* X9 A; J5 x if(head==pre) . t: {. ?5 t% H return -1; 2 n' o' L1 ]- G1 V b! Y+ I- D 8 B5 c6 x" j/ `* n1 s/ i MultiAdjListNetworkArc<WeightType> *p; ; T7 M8 F* Y& Z" ?, f p=vexTable[head].firstarc; . s2 }" K/ p! M" x6 `( v1 o if(pre==-1&&p!=NULL)4 J! r0 @- }: x7 g7 W3 g: G; j! j
return p->adjVex1==head?p->adjVex2:p->adjVex1; 8 ], j/ B' W" P% I" P% @( g* i Y //pre!=-1&&p!=NULL $ l& ~; V3 w% C+ V% g while(p!=NULL)9 j7 F0 I1 D4 V0 ?
{ $ k3 Z# U% B! V. D if(p->adjVex1==head && p->adjVex2!=pre) 6 n" @6 M5 r+ U5 ~6 V* K p=p->nextarc1; / Z* c0 B' g$ u- S9 d4 ]6 N else if(p->adjVex2==head && p->adjVex1!=pre): D$ J q4 E0 ~( R
p=p->nextarc2; ; j5 J8 Q; A" p! k6 ^ else if(p->adjVex1==head && p->adjVex2==pre)4 E# n9 r5 j' r& q8 {0 m9 j
{ & z/ {3 j1 ]2 r. y p=p->nextarc1; + m9 V V# W# {$ @0 g break; 9 g* @! |* q. Q# z- S3 y C. A W } - o- A+ m! w0 c" z2 T6 P7 W! R! O else if(p->adjVex2==head && p->adjVex1==pre) 0 |$ E D7 k+ y9 Y6 l( C {7 Q$ e! Q9 Q* C" E8 S, u* p
p=p->nextarc2;, A+ w5 `8 U3 U0 e- v a# P, b6 w
break;2 z8 t* c2 q1 a+ u9 \
}* u' M" i2 b# r" D6 x* c
}3 a9 d9 p& n" d/ f& Q3 b! ]
if(p!=NULL) ( E4 Z& u# I1 s { % I" F" Z ?7 D( A$ V return p->adjVex1==head?p->adjVex2:p->adjVex1;! N/ H" ]* X$ Y# b& W3 [9 t: f
} ; V: T8 l) z y c else ' _- S. n; x9 u" Z# o; D/ j return -1;( ^0 M; b) b' ]$ g. @' H
} 4 G0 r- q: V+ S2 b. y) O, p$ Z% s* A2 T3 D5 i
; |+ M1 S& [3 y7 R2 C% Ntemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS3() 8 Y' ~+ T& g- u) |0 q! m{; y+ K8 K. l3 D& d. ^0 h
stack<int> s; & I; A# R# M- A; ~( l int p,cur,pre; 0 n* H& J* ]3 c //MultiAdjListNetworkArc<WeightType> *p,*q; 3 u+ I+ s; P0 [ for(int i=0; i<vexNum; i++) tag=0;//初始化 * L8 u o# i1 d# C5 H / u9 U" w7 } F1 z; u. q for(int i=0; i<vexNum; i++) 4 T' r8 N9 R6 G! H: k& f8 Q { ) a& ?' v0 F4 Z3 }$ U& C cur=i;pre=-1;0 ?# b' v+ k& L1 B4 j
while(tag[cur]==0||!s.empty())& Z9 w) t N' F8 T5 g( O$ s
{ ; U. L8 D6 Y; E2 L& V while(tag[cur]==0)1 D5 d- U/ K& m0 X6 c' a* C9 W
{ ( v* p9 B( g% h/ e( c cout<<vexTable[cur].data<<" "; 6 u# w# r0 }4 J! ^4 [5 W5 Z s.push(cur);) C$ b1 A$ x1 g+ ]' E" C
tag[cur]=1;+ i' Z% J' g2 U; l i: s/ B4 ^; Y
//初次访问,标记入栈 z8 D5 C* ?- p. }- V) F: [! I ( b( ?1 B3 \3 t' Y p=GetAdjVex(cur,pre);//p是cur的连通顶点% p9 E! t1 T, _: I
if(p==-1)' }- E% \& R3 u. `6 k, j
{ ) a: Y6 a( j# _ pre=cur;s.pop(); . p2 y9 N/ z+ b) H break; ) s) c3 u% D, |8 c3 ` } / s0 `) ^9 S! h else5 L4 `/ ~- U, Y5 {% M$ R' ^9 K1 f
{ # U0 ~& U, B- c, f; I pre=cur; 2 e( T* ~0 E- g) M5 L8 o cur=p; # a U2 u, I4 g h3 @0 p }3 [5 ?- _/ P5 ?. m# j4 p. n
# q: k, v% O, c& v0 t( F2 Z6 Y } * q% n$ Z9 q( w8 p while(!s.empty()) & K+ p: ~5 n/ e* ^ { 9 t, K$ @2 o2 T6 R cur=s.top(); ' J8 C- t' ~& Z$ Q2 J i p=GetAdjVex(cur,pre);4 N0 m7 D+ p& k6 F
if(tag[p]==0) " F1 R! }" r% ?/ |% ^ { * I1 G3 Q4 L1 V3 r7 c2 p pre=cur; 5 z) o) D# C+ B6 Z, Y cur=p; 2 d6 b0 L% H) B! D; b8 y break; $ A8 d6 [7 n5 v. e6 o, A. i }7 f+ a- I, M, D" u& K
else0 C6 v: t( Y1 Z# O# C5 X
{ + L% n4 N$ O! L pre=s.top(); k; j0 O( J- ~) u4 ]- j6 [/ s6 _
s.pop(); . \! L1 V! o, E* x2 Q. i }$ o% q- x+ {' J) M3 @) I* K3 z
! _- x. C+ g* ^. N/ Z2 G
} ; F$ Q; T# Z; [7 }3 d" y; C- W" {3 \4 v; Q" f2 ^/ A
} ' J$ e' @0 J' ?' b T8 i5 ? } _9 ?2 y* Y1 \( m$ E0 b7 B}' E! w6 p8 j1 S: h" Z+ r) ?9 g
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>::BFS() ( q8 i L, O/ w: g- Q# X, ~: ]{* J* `3 H2 G+ ?! A
for(int i=0; i<vexNum; i++) $ Z$ J- \5 T/ j) v$ x tag=0;/ R. x2 a# g" S" f: H3 U4 A
queue<int> q; 6 T; j! W. t+ D% c int tmp,t;) U, ~; @* J% O, V
MultiAdjListNetworkArc<WeightType> *p; S5 P' O1 w5 H7 c9 }: t9 @ for(int i=0; i<vexNum; i++)* p j5 N" a d6 O. M* u/ G4 [7 |1 i
{. P/ H/ N. f: c4 N/ h4 a+ B c6 H
if(tag==0)8 E: K3 P8 |/ c0 i
{, b6 m! q. W8 e; M6 ~" I
tag=1;" @! w3 Z; X5 G9 }2 J& @! j2 X! s
q.push(i); ' a8 {4 z$ P: \' E cout<<setw(3)<<vexTable.data;+ C/ t% ^3 \( c& z8 y- L$ x
}5 ?* P* B( B5 o
while(!q.empty())3 ?$ {" Z4 q9 R6 i0 F
{ 8 d) Q. e/ O# R9 w( ~ tmp=q.front(); 7 r7 U9 j4 n7 F% [ q.pop(); / G& X H- }& g! c7 X$ F p=vexTable[tmp].firstarc;% m8 v6 H7 @$ S! `+ D$ D* r2 e
while(p!=NULL) ) |6 M& Z( `2 K( L; E {0 `$ _$ ~; w# K( H+ F3 A0 i3 ~/ v
t=(p->adjVex1==tmp?p->adjVex2:p->adjVex1);4 h3 J+ F, Y) A0 C6 l4 e. t$ L
if(tag[t]==0) 6 [' ~, t1 D7 a' \( o, t) j/ u1 j {* f# u2 Y: y: r8 y
cout<<setw(3)<<vexTable[t].data; + H( B8 J L s9 N+ y" { tag[t]=1; 3 v( ^$ i7 H, k9 i; K& O- h- K q.push(t); ; n \: h, |/ Y/ V* ~: x& ^, n } 7 x1 Z0 R1 |7 Q/ A) D P p=NextArc(tmp,p); & J$ t6 U: y. _0 x: L$ Y# ] }( C/ u( I* ~) v9 q5 Q7 N% g
} 0 C3 A5 J! z* ?$ v$ h- S } . o& [( b, _- Y6 _2 @5 s8 j}6 q+ j7 O% l3 ^# W% K m/ x
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>::Show()4 Q I& V% _0 ?2 F3 b: `4 ]7 L
{# l( ? q. U( `3 z( j, u
MultiAdjListNetworkArc<WeightType> *p;- S# [ w+ I h( i
cout << "无向图有" << vexNum << "个点,分别为:";. @4 _5 V$ ?4 \0 d3 h
for (int i = 0; i < vexNum; i++)" f3 w" E/ T! }, w- S9 @1 i
cout << vexTable.data << " "; ) ~/ i2 Q% R8 f q cout << endl;) o/ N' Z1 P" W* s2 h$ }: N
cout << "无向图有" << arcNum << "条边"<<endl; ) p) ^* u6 U/ X% ?; x( Z" T3 ~ for (int i = 0; i < vexNum; i++)* w8 z* t0 u+ f& O& n2 E. J
{- N- I- f& z) m" S5 Q# Q& j* a6 O
cout<<"和" << vexTable.data << "有关的边:";( \3 R& m, J8 C5 c
p = vexTable.firstarc;* o3 @7 C4 T! o
while (p != NULL)3 w a8 t$ z# k" a+ x7 K
{6 z) o% [" s+ W$ z2 J5 `# z
cout << vexTable[p->adjVex1].data << "<--"<<p->weight<<"-->" << vexTable[p->adjVex2].data << ",";: [) [: ^: j5 d
p=NextArc(i,p); ( j/ d" U$ y8 I' d } 8 s8 _2 f" v' K" c- z# s( | { cout << endl;3 G `6 S, ~7 v F$ ?
}; q1 O5 \- z2 J
} ' B9 X0 ~1 K9 z& n1 Y' v& H: {7 {5 h9 L+ l2 P: E8 `4 c. z+ E
6 b3 t8 V- ?% V0 ~1 f& }1 U邻接多重表与邻接表的对比 6 o% }& k, J% D# p- e- ^8 o % L! g- k" c: {0 A* \( h* D+ ^邻接表链接9 ^2 u" w- K8 e5 n+ g
在无向图的邻接多重表中,所需存储空间与表示无向图的邻接表相同。) L, S/ o5 w) [- L. B- @4 P! f$ K4 \
在无向图的应用中,如果更加关注图的顶点,那么邻接表是不错的选择,但如果我们更关注边的操作,比如对已访问过的边做标记,删除某一条边等操作,那就意味着需要找到这条边的两个边表结点进行操作,若要删除某条边,需要对邻接表结构中相关的两个结点进行删除,显然这是比较繁琐的。 9 h6 T) [9 K! X, O为了提高在无向图中操作顶点的效率,又有了邻接多重表的存储结构。邻接多重表与邻接表的区别在于,同一条边,在邻接多重表中要用两个结点表示,而在邻接表中只需要一个结点。此外,邻接多重表中增加了标志域用以标记该条边是否被搜索过,避免了同一条边的重复搜索。& x0 R. r& D) c' F+ f1 U* C
———————————————— ; s4 Q, e9 F# n7 C- y版权声明:本文为CSDN博主「lseaJK」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* c$ e/ n- H7 k
原文链接:https://blog.csdn.net/qq_43413403/article/details/105766958- b" I! r4 }8 _/ b6 P& h
6 M, R7 s q/ F* u, o
) i4 |; L: Y+ j! f
8 D8 g" r: X, \+ M, l, L/ l8 v" o* y [! J5 V
———————————————— 1 Z- @5 B: _. U版权声明:本文为CSDN博主「lseaJK」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* A) J% c0 U' y4 A u
原文链接:https://blog.csdn.net/qq_43413403/article/details/105766958 . z( G' _7 p0 u0 L: x 7 ~' p; X I) \% _+ L , n' |/ m& g. J _# U9 x