( @& g3 M& }+ s' I( L1 ~ p = vexTable[v1].firstarc;2 g: R: C) D! f* b
while(p). n- g0 n7 E; H( V: w9 S* |) j1 x
{; K, `+ ?, _% U, j6 C
if(p->adjVex1==v2||p->adjVex2==v2)//边已经在顶点的邻接边中 / X! k2 F) \, @3 v% F) M! O+ u2 l4 Y {' d6 \& `2 a" d, ~$ r, x
if(p->weight!=w) 9 V5 t( }& A6 j& S/ G2 q p->weight=w;3 a& R: ?+ g+ h; F8 H
return;9 k {4 ~! v" R! L& l4 c
}8 p$ k3 h; k# H/ k% F, B
; D: y5 @# F+ ]0 F- P
p=NextArc(v1,p);1 e Z) r) H9 Y# Z; h
}: t/ h s) r# e
p = vexTable[v1].firstarc;. X) G0 X* S0 a, T
q = vexTable[v2].firstarc; 6 y8 z/ b7 v$ q1 ^/ u2 G vexTable[v1].firstarc = new MultiAdjListNetworkArc<WeightType>(v1,v2, w, p,q);//头插法 4 a J6 \. j$ F. T vexTable[v2].firstarc =vexTable[v1].firstarc;7 @: S& x9 X& y! q
arcNum++;5 n( r* L4 U7 U* t& t% ^
} 6 G; L9 ~+ H/ v/ Q6 B4 O+ |' M6 x: }
template<class ElemType, class WeightType>/ O' Q& B0 V; Q. L& `$ Y/ p
void MultiAdjListNetwork<ElemType, WeightType>:eleteArc(int v1, int v2) ( m( ^0 m2 Y ~" d{. Z: ?* {3 i8 a& @% z, | G
* b W0 Y- T6 v+ P0 ^
MultiAdjListNetworkArc<WeightType>* p, * q,*r; , b; i( ~9 O3 f6 I if (v1 < 0 || v1 >= vexNum) , S) v e, C1 j* A throw Error("v1不合法!"); 9 X1 t3 E9 X) X$ u if (v2 < 0 || v2 >= vexNum) % R; F# S8 o5 \. | throw Error("v2不合法!");; W, t T* \7 n: A7 Y( r
if (v1 == v2) s: P! y# v8 A. R0 T; @
throw Error("v1不能等于v2!");' o. w$ O+ b1 m7 d* d, r) \
; i0 r' v3 @' j' P/ {- P
p = vexTable[v1].firstarc;/ T5 T9 R$ P* }6 g
while (p != NULL && p->adjVex2!= v2&&p->adjVex1!=v2)) ]) p" t. M" `8 y- U
{) [# Y0 C8 R1 A: d! u6 |
q = p;6 R3 |! {+ l, c* r' I
p = NextArc(v1,p); & M8 Q# l1 l$ z8 x }//找到要删除的边结点p及其前一结点q' }2 }, f, Q# ^5 \9 G* e
2 v' W/ M- u! `- K if (p != NULL)//找到v1-v2的边( E- @, }# b6 ?, K' H: n
{ 9 U4 W% b. D- @: O% b1 n r=LastArc(v2,p);) z! w _; C5 f& ^. p- `/ G, q
if (vexTable[v1].firstarc == p)//第一条边,q此时为NULL * |* M; Q% l- z; l% ` if(p->adjVex2==v2)6 g$ @$ ?6 |0 e4 M" A9 Z2 B. U
vexTable[v1].firstarc = p->nextarc1;7 W& D+ A/ q; @: D
else vexTable[v1].firstarc=p->nextarc2; 5 H; Z8 F) x2 w* @5 t2 G' c* y7 m else//不是第一条边 ) s3 \& g @+ s. K& X- ^6 c { 5 `8 S) R5 ~; O* w4 O- w$ Q0 k0 E if(q->adjVex1==v1) ' Z) ~- h5 z: w) a+ `" `! l8 f q->nextarc1 = NextArc(v1,p);5 m( ~( M% E: z4 J2 J6 S( @" D
else ! C: h& w! H; o) g* e' y q->nextarc2=NextArc(v1,p);9 N5 I0 H. E- N2 m0 m( \; L
% s# w' D# T7 p- k0 M# |: j9 M. S
}9 D6 m6 O# }. k' x; D w( {
if(r==NULL)" O/ Z- `7 j9 O% J7 H# f
if(p->adjVex2==v2) 3 |, d; ?" S4 l6 O0 H vexTable[v2].firstarc = p->nextarc2; ( o% i! v, Y& u2 r# i else vexTable[v2].firstarc=p->nextarc1; % ~2 n _/ @' e& J+ x else+ Z4 Q' K; n/ S, C; l, O& L
{' B7 @; @/ H" U* {, u1 R
if(r->adjVex2==v2) & F3 O0 e7 N {& A! y r->nextarc2 = NextArc(v2,p);; F- ^( @; l# |1 w4 B+ M- ]
else% C, A5 {& M9 M* H, V n
r->nextarc1=NextArc(v2,p);" O* ^1 k; L' {* f( G% i6 k
} . C7 a# j2 L% j; ~6 A6 |! t delete p; " T7 r; c2 Y! X& K3 D. {0 Q arcNum--; ; u* V9 E3 x9 E2 w8 Y, k" S! K }: S, |2 `% Z$ i R! D
2 E O. [; R0 Y}! S5 N4 F: o( g. N) w# y
template<class ElemType, class WeightType> void2 y, G4 r5 ?9 O; k6 ]/ l
MultiAdjListNetwork<ElemType, WeightType>:eleteVex(const ElemType& d)- I. F; A, o3 j5 d
{4 R8 U% G+ o2 w A" f: j3 I
int v;+ M Q. ]% L% d) r
MultiAdjListNetworkArc<WeightType>* p;. A* o' J8 q. G7 I/ P. B, f
for (v = 0; v < vexNum; v++)//找到d对应顶点1 A( y$ e( T" ?( R, o# K
if (vexTable[v].data == d)) {- j8 k i6 T: Y6 m
break;# O8 C" {( |* L) S' }. [
if(v==vexNum) 3 v3 b. N9 {, t, f/ Q5 [7 X% t throw Error("图中不存在要删除的顶点!");. ]! t6 |! e3 S3 m* S2 ?5 p8 _9 }
_! G8 |: u' r. V- q" u for (int u = 0; u < vexNum; u++)//删除与d相连的边6 Q7 T! o0 c8 Z9 J$ z
if (u != v) ! I* Y" F# v/ D+ X" L {4 _2 B3 a D# ]3 c; _$ k7 }
DeleteArc(u, v);! J7 ]6 ?* Y {; w
} 4 N5 z+ p* s7 u: |# u1 E* `# ~ vexTable[v].firstarc=NULL; / \4 Q# w% d( L9 G4 Z ! _8 V4 W6 Y& V O* ?& n% D vexNum--;///将原来的vexTable[vexNum-1]即最后一个节点移动到原来v的位置3 g, u6 s* ?/ h, C$ H0 J% a& t
vexTable[v].data = vexTable[vexNum].data;! z( ]7 X4 {6 h& u; |7 q( T
vexTable[v].firstarc = vexTable[vexNum].firstarc; / d, x' O2 a6 f/ f8 r. [& r vexTable[vexNum].firstarc = NULL; ) x2 K" K' n; g' K: b$ [) _! g. }+ U tag[v] = tag[vexNum]; , V& g- l3 {' A9 g3 M: h- V+ R //原来与最后一个顶点相连的边改为与v相连 8 e$ t* P! r8 U" {0 [ for (int u = 0; u < vexNum; u++) ( e4 u5 L( y: \' k1 h; q3 } {# g% Q: g, H) y/ C. o5 |
if (u != v) * v$ y7 l0 H& J: C! F { . O% y: i$ A3 t8 q p = vexTable.firstarc; " K6 H+ X0 o# b: z+ V while (p)6 L* ]3 M6 U1 }( h# t: i9 x7 O
{ 4 |3 K. b% G' K: b if (p->adjVex1==vexNum); @/ p, ^4 {5 B- `' {0 G; z+ K9 d
p->adjVex1= v;4 f" h8 z6 q& a$ v- T" x/ ^
else if(p->adjVex2==vexNum). k2 Q7 F9 k) {5 H
p->adjVex2=v;2 y/ O7 k; ?! i2 @( d, B1 i' z
p = NextArc(u,p);7 f& u4 \' U7 {& W: z# ~! ]
} G" L2 l7 j4 E } # ~# n* V$ G. e4 y% P } * E/ C) l6 _5 Q9 v6 x}; d$ Y& ^4 N; G! S5 H! @8 Q9 m
///深度优先遍历 % b' n4 z v+ z2 H+ Q- atemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS1(const int v)$ R5 @( O: y4 P5 B
{4 J1 y; q& N2 p8 t0 _9 z# x
tag[v]=1; 3 j0 {* A' }- a6 O& U cout<<setw(3)<<vexTable[v].data; , y/ \) Q5 @% s7 O- g MultiAdjListNetworkArc<WeightType> *p;1 P& b2 `9 V# R7 a0 A# n+ x; G
p=vexTable[v].firstarc;. z" t: _* f8 J Y/ r
while(p) ^9 [9 C3 _7 e$ j/ {8 Y$ p( F$ z+ a5 D {4 j; C+ M* l# K9 {* \* M) ], x
if(tag[p->adjVex1]==0) X+ l( A7 O6 t* ^) |& r DFS1(p->adjVex1);0 [$ p3 A# `, {
else if(tag[p->adjVex2]==0) 7 z$ C, b5 g+ U" \' r DFS1(p->adjVex2);! G+ O7 g- x6 Z
p=NextArc(v,p); + e m7 U" Z$ }! H1 t3 g3 \- E } n% o3 r9 C' f0 [} & Y3 r( f- \" R+ }% ytemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS1Traverse() ' t# m4 t# _1 t3 Q" C% E3 H1 d5 D{, M" s7 w1 N' P& _
for(int i=0; i<vexNum; i++) % d; o! ~, K; Z5 p1 f tag=0;* O% }4 [& [/ Y$ _/ ]+ N. F) m! g
for(int v=0; v<vexNum; v++)( k+ z# t( C; U* U, z4 N
{ 2 ]1 N7 g6 @* ? if(tag[v]==0) ' R7 h. e, C3 F" i1 V5 d DFS1(v); 2 w1 a! c! c( R' a } 1 I) z9 E/ j1 [" e! S" k5 t} 5 T6 W0 g) ~+ H* m/ wtemplate<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS2() 8 y4 _( B8 l4 m{ # [3 [3 @; o2 o( B: e stack<int> s; 3 k, o5 B$ W4 |& ?/ W* _+ z* ~ int tmp; 5 R! E( R O/ e4 y4 \7 [ w, T MultiAdjListNetworkArc<WeightType> *p,*q; + d0 \: R: g- b9 \* F( X6 Z7 | for(int i=0; i<vexNum; i++)6 v' E1 Y. w! h+ O Z2 s
tag=0; ' I% a: s- F, P+ i for(int i=0; i<vexNum; i++) 3 S" A8 a4 h" \7 }: M1 f {# J1 p1 z k1 f! H X8 o: x7 y8 p
tmp=i;, F! E& w! i- l) P5 S$ m
while(tag[tmp]==0||!s.empty()) - U" y7 s, h$ P# V+ E8 f- U3 _. d {: h6 p0 h$ ?0 D0 L; }* \+ R5 S
p=vexTable[tmp].firstarc;( |! K4 B, q8 E. o
while(tag[tmp]==0)6 r- _ F% }) }2 u0 u9 V
{ + t0 Y( [6 e5 ?4 r3 H% d1 e4 E# m6 F s.push(tmp); # i, Y6 y8 E- h1 V+ f; I cout<<setw(3)<<vexTable[tmp].data;- S" a8 o: _' g
tag[tmp]=1;+ G- n$ N& ^4 m* l/ k- v7 p2 V
p=vexTable[tmp].firstarc;8 Y! I1 G0 }4 f2 k- L& o2 B
if(p==NULL) break;///该顶点没有边,连通分支结束(1个点)先出栈再跳出循环进入for8 t! f8 ^1 |) r( d% b+ Y, U
tmp=(p->adjVex1==tmp?p->adjVex2:p->adjVex1);( s! D2 g7 b0 y0 j( c2 e# b
//cout<<" 1st tmp="<<tmp<<endl; ' q; P0 ?2 u/ O& b) h }/ e- ^1 O( v. W$ M9 ?4 y9 B7 t3 H
if(!s.empty())5 n/ k* M8 U5 h
{1 n) ]5 e2 l T
tmp=s.top();, F; z4 ~, B3 p+ J
s.pop(); + i v$ H9 }' @4 a- [3 \ q=vexTable[tmp].firstarc; / O: ]# o6 q, ~; u7 Q: T3 r int t=tmp;2 f l4 f* G" Z# Q- h0 U% ~
while(q&&tag[tmp]!=0) 1 B. V A/ ]7 L# i {! R. h# m9 W5 c$ d
tmp=(q->adjVex1==t?q->adjVex2:q->adjVex1);! r5 I1 h, g( |* t- \+ U: x5 w# x+ p5 o
//cout<<" 2nd tmp="<<tmp<<endl;) l/ C# y3 ^9 I3 l$ _; D
q=NextArc(t,q); 4 s' n5 J, {1 j! d } . \+ v3 n# i% S# l if(tag[tmp]==0) . ?# {+ D0 T. X, g; l, ~/ t s.push(t);7 M( ?5 T' d) N2 B3 A
///1、对应上面连通分支只有1个点的情况 ( i9 w! T: ~3 p ///2、t上的点都被访问过,此时tmp是t相连的最后一个点,用于跳过上面while,再次进行出栈7 f2 E9 ~1 b( l! ^
///tmp要么等于找到的第一个未访问节点, ( b. A% D! j' p8 c) q5 G ///要么等于与t相连最后一个点(已被访问过)$ J. U R! }. f' Q* c6 \, V2 |
///当连通图只有一个节点时,这时tmp=这个已访问的孤立节点9 \9 H6 w5 d$ K# p1 A- [8 J
} 3 O O1 X. R/ ? }% c' n; ^, d- ]7 A
}9 A* M2 a. T p9 @+ \/ y! u
} # B9 y) n/ I0 G$ s6 ?! I9 t* d//从顶点v出发的一个顶点u,返回v通往的下一个顶点;如果没有其它分支或者已经是最后一个连通点,返回-1;如果要取第一个顶点传入-1" W( a8 W. ^3 G7 ?: U( L& s4 J
template<class ElemType, class WeightType> int 2 b! ^" d3 P; ]$ SMultiAdjListNetwork<ElemType, WeightType>::GetAdjVex(int head,int pre) ' H0 W& o1 ]0 y; s0 @{& F3 i2 _- n# J, ~
if(head==pre) * e. l. B& C, b, z return -1; 8 G3 P) ~9 j: r4 i1 N! c) }4 D , G$ o' p) r4 x5 I" l8 N MultiAdjListNetworkArc<WeightType> *p;4 {6 y) c( w% R2 b+ V8 O
p=vexTable[head].firstarc;- ]" Q% I B4 L8 F' g7 E
if(pre==-1&&p!=NULL) 0 E' s6 V6 `0 D& L3 Q8 ~( S return p->adjVex1==head?p->adjVex2:p->adjVex1;6 a* N$ t# N! @) ?1 N
//pre!=-1&&p!=NULL ' e s7 Y) L" {+ t+ ]; m8 T while(p!=NULL)0 y' H: A5 n d6 }+ b+ {! i
{ 1 c# \, f; `! N if(p->adjVex1==head && p->adjVex2!=pre)8 t0 ~8 U" a3 k. g( B1 E/ V$ \9 T7 F+ ]
p=p->nextarc1;, N% L2 U! ?; Y4 C
else if(p->adjVex2==head && p->adjVex1!=pre) , S! \3 t) K6 Y: `' g$ c p=p->nextarc2; : I3 [3 @7 h6 }! [6 k* \3 T else if(p->adjVex1==head && p->adjVex2==pre)8 J$ y# ^$ o/ X5 D
{9 n. R! } E4 I
p=p->nextarc1; * p+ n+ J6 V$ a( L. Y m break;. k# p" ?% f% j5 E
}, u0 ~! p5 l, ~
else if(p->adjVex2==head && p->adjVex1==pre) ! _% U% ~2 }- V) d {- v8 R- S) w, @; T$ X( i" G
p=p->nextarc2;+ f* K9 P; A8 R Y
break;! P$ N7 t2 I' U
} q. k* I6 n7 R8 V } " v) [" v! m( Z& W# a9 M, h if(p!=NULL)0 H% d( l( m, b# i
{0 g/ j6 q3 o) z: T- u/ L6 k, u3 g2 Y
return p->adjVex1==head?p->adjVex2:p->adjVex1; . J6 w/ b5 G- X! C3 V8 N }7 b: o0 i3 u: B( g3 |/ w
else , x; Z6 ]2 n' E7 [/ d( h, N return -1;" R( i2 O, |$ r0 ~
}" V3 p, I7 Y8 U4 m( f* |
5 ^; K r. i; W$ F5 D0 s4 {8 J. R0 I
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>:FS3()/ |/ N* f9 T) Q1 R: b% Z9 j
{ " I3 u6 ?9 A. W/ i# M) l6 w stack<int> s;3 `1 [0 H) `& T, ] L
int p,cur,pre; 2 a3 _! m3 i4 l3 n //MultiAdjListNetworkArc<WeightType> *p,*q;. d0 x4 g- k4 Q
for(int i=0; i<vexNum; i++) tag=0;//初始化9 O/ ~9 [/ I# E7 o4 h' Y( C
7 I' s5 B% t# \: ^' F
for(int i=0; i<vexNum; i++) ( m1 h7 ^, x. Y3 b1 B/ @' m5 G { Z' |! M! @( D
cur=i;pre=-1; ; Z7 p% W* }+ ] b$ W while(tag[cur]==0||!s.empty()) 2 K9 ~; t8 R P* Z; ~ { ; R8 K* I" W( v( f" v/ v while(tag[cur]==0)6 b, J) Y `- L, W( o! L* y
{- t! G J9 T7 g6 Y3 f$ p: _% b/ o& ~ `
cout<<vexTable[cur].data<<" "; 3 y) s, j2 f, e# y+ m2 \ s.push(cur); ) B- Y/ |& h; ~1 h3 M- ~ tag[cur]=1; 5 P* d* c3 P7 k& s9 s //初次访问,标记入栈1 E6 N7 L$ i& i' Y+ I
( P. g6 M2 Y: y. l. u+ m p=GetAdjVex(cur,pre);//p是cur的连通顶点 2 C; i! e; D. J. r4 C1 c7 N& l* z; C. H if(p==-1), F+ v2 W- m( [) m
{ 8 B) `8 n: D- ?. b. A7 s pre=cur;s.pop();" A+ b! C( j3 q2 o; L
break;/ e/ J0 [, y+ @+ D2 g- {
}* R; `& z1 n! E R6 U; o0 n
else: K6 @" F; i* h/ J
{9 E% L, P6 X+ X7 i1 m6 `
pre=cur; 9 ~1 y! `" N) V3 S2 x cur=p; 7 T+ Q& J) q# X6 N1 R }& c& Z6 ^* Q& k9 \2 ~6 X: S
1 u. h ?) ?, `* C
} $ p. h& T- y4 l2 c: @ while(!s.empty()) % g0 g7 F* u( y; x$ r3 K, d {- k- i: I# {* g
cur=s.top(); ( G4 ^" y6 q4 O4 t+ K, Y+ d p=GetAdjVex(cur,pre); " j. w1 S" e; ^' ^; S6 z' Q) j if(tag[p]==0) # Q) | r- R# }! W7 f- I$ g {) Z4 G/ R- g0 s6 u6 l/ x
pre=cur; ' J8 {$ i9 N: S cur=p; * z* R1 W& m% r8 x) d break; % E8 V+ n h. d& T; K/ C8 ~, j } 4 m- L, |* ~: c# a8 H4 ] else% ?/ Z- m2 y: h+ N' T
{" `+ i" r0 \/ L* m+ n
pre=s.top(); 4 O. z1 D. Y. z" f3 B8 [7 i% F s.pop();. B8 a* W: |& Q) u$ k6 L
}1 a$ Q% A, L' [
5 V4 L% S8 D/ |+ f2 K4 r
}6 b# S( |1 S- J& [' N3 G
7 q( s' k/ L, h7 { } 7 d' X0 b: d" j } # W* c! f: y5 B: D, `5 x}1 L4 J$ a1 Q& n1 t, X' J% _5 n5 i
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>::BFS()9 T, P$ K) m; U0 c
{ v/ t: G+ y5 h) z
for(int i=0; i<vexNum; i++) ! K8 s* L' Q- I% X1 v$ H1 N tag=0; : T3 A; L5 L9 ~- i9 `2 H; O- E7 c- ~1 E queue<int> q; . G6 }( A$ k* y5 z0 q int tmp,t;$ n: J; c; C; E
MultiAdjListNetworkArc<WeightType> *p;7 U, B; A) a; y5 S4 ?- W
for(int i=0; i<vexNum; i++); }; l& z1 [3 m) Q H
{ 2 n! l O% X* T$ B$ z% U1 A% r if(tag==0) 3 q) U1 d* V. s4 X$ P {* ^. R! t* E3 T9 A3 w( ?
tag=1; @7 s5 J7 F/ |- a$ y, j
q.push(i); ( f$ S3 x0 P1 Q0 w4 k9 M cout<<setw(3)<<vexTable.data;! }( P8 i$ B2 ^+ P! F6 f( h
} * ?6 G/ C' h$ f5 m" d8 V% [+ Y while(!q.empty())" ?1 D9 g' V! O& F4 ^3 p
{# B4 ?% O2 v/ u7 M1 }' K
tmp=q.front(); 9 q, G7 T; n0 e' L8 j q.pop(); 4 t; ` {4 R+ Q' Z& E9 q p=vexTable[tmp].firstarc;8 E L6 D) R- X/ ?) B3 M: Q2 B" Z" g
while(p!=NULL)3 {! V& B- M9 x9 y, Y$ i; ~
{ s1 C/ t6 e* ?, ]
t=(p->adjVex1==tmp?p->adjVex2:p->adjVex1); 4 H8 ^( c3 h% K, ?8 ^, y" \9 T if(tag[t]==0) $ b. W, e" T" c3 X6 [" S {5 B' D+ q/ {& O/ m' A6 f
cout<<setw(3)<<vexTable[t].data;0 _0 L3 V" T0 \5 X1 n) _
tag[t]=1; * {9 w9 }. J5 B8 O q.push(t); , W2 F0 o% q3 `+ {- U }- R- g' P2 H m% F( ]5 W
p=NextArc(tmp,p);$ ^: p0 Q8 H* P. I3 i: q
} : p' W H0 B& I! Q3 r }, j, |! F& Q: @
} 5 q3 E3 d8 Q5 a: ^! h, m- F}6 U0 G6 P/ K% t2 X2 N
template<class ElemType, class WeightType> void MultiAdjListNetwork<ElemType, WeightType>::Show()! [) W- S) m) k- _* B& a4 T0 t: H
{ 8 A5 a! }$ \# ~4 s: o! _2 Q" [ MultiAdjListNetworkArc<WeightType> *p; 1 E9 y. Y9 w' Q+ U3 b8 ~/ K cout << "无向图有" << vexNum << "个点,分别为:"; 7 C! `6 w: V/ l9 X! _) A4 o for (int i = 0; i < vexNum; i++); d8 q6 R* p# S( a) t; Y
cout << vexTable.data << " ";" H' h3 \+ d* G0 v# \6 x
cout << endl;* W$ H+ w+ X8 s( p( P
cout << "无向图有" << arcNum << "条边"<<endl;, z& S+ n, `& s( d% s% s
for (int i = 0; i < vexNum; i++)+ @( u) e/ X6 Q8 L3 y5 f; }4 v* c
{ 6 y/ O8 V0 D2 G6 ~* a cout<<"和" << vexTable.data << "有关的边:"; . D- T, n$ c3 s w+ K p = vexTable.firstarc; , c2 h3 [+ H) \ u while (p != NULL) - m$ y) d% j, Z q6 |4 j {! a: v! C- _# t7 |
cout << vexTable[p->adjVex1].data << "<--"<<p->weight<<"-->" << vexTable[p->adjVex2].data << ","; + M" Q7 }! W" x6 F- o7 A3 c p=NextArc(i,p); - Q( k0 Q9 i4 G% y }4 u( ^' y0 ~! E. x7 j9 ~* O
cout << endl; 2 g5 j2 m# h( C& |& D2 z& I, c% \9 \$ d }( H. G0 `. b2 `8 n6 G! T7 ]* o# P
}7 C' y: X$ Z3 c! U# O* ?& r) L