function [nc] = ncutf(g). p$ X# Y: _, Q3 ?/ R8 K" I! O0 }2 P6 k
%求割点的算法 g为邻接矩阵 nc为割点的集合 : K# ^" L8 [6 F. E/ cn=size(g,1);0 p$ |5 l3 |( d n
if n>=3 3 R! l+ p6 M( S7 X' J" H! f a=sum(g); . R8 D- I4 u1 t( C: [" z' t9 |& t b=sum(a==2);7 p7 y- V& a' x: Q- _* ~' W; k( E
if b==n ; ?6 e0 Q, `& H3 e; \- c8 J1 L* @ fprintf('本图为圈,无割点。n')% n/ [* x3 s' K! q# D5 L- S' M
nc=0; * W% J; B7 A) o% D$ R S8 p end 4 W M5 b, b0 Z1 jelse 6 V5 A9 Z+ n4 T% K, E: P [w,k]=dfs3(g); + T' e, B, B& m9 c) ]- O %nc=[]; 7 Q# R) I9 ]0 Q2 D+ F nc=isncf(w,k);( F( e" o% D: f+ B. ?4 P: s
n=size(g,1); % _! F6 i/ g1 E for i=1:n0 }0 B' }2 @! O7 q u$ F
for j=1:n % V* p1 R- P1 l; H* S if w(i,j)>1) S7 a7 `3 }! n+ \0 f/ z' ?4 M
if k(i)>k(j) 1 S& F; Z+ R3 h ]/ {9 a g(i,j)=2; : V3 ^6 s5 ~& d- i( w else1 q0 @+ J4 z" M7 N; K5 }# m& r
g(i,j)=3;4 Z C# z2 M l z: }, W6 [
end& b% ?: C, D1 }' p1 S+ [7 v
end " b) E5 b: A6 c0 d end - y2 ?% ^% P0 v2 m end) L. E% m1 x3 s& [( s) R. H5 N% e
3 @2 e- l2 u- ?$ K9 @4 b for i=1:n& m- w- G5 Y4 K) X; G" E- t
f1=find(g(i,==2); T9 A( ?) O' _- p! a5 a* V. a- W
f2=find(g(i,==3);0 `( t4 ?* f' n. Z4 W7 X" D+ m$ B. g
f=union(f1,f2);! |3 ~/ O, \5 g$ v
l(i)=min([k(f) k(i)]);" ]$ f4 R2 e# ]* V% W' R
end; I' W- P& E" I2 z& Y H
/ ?- J, G! X( L3 N \6 c L
for i=1:n 1 i( a y& z# l2 v0 A) W0 b; x for j=1:n ) H9 }* `0 H: `7 |/ ]- w1 F if g(i,j)==3 & k(i)>1&l(j)>=k(i) ; C% X& x% \3 T ^ nc=union(i,nc);& D; s4 ^4 _5 m( o6 T0 Y- J& A
end6 U/ b/ g" x; d6 w! x+ u
end( E; I: A% I7 L3 u
end . D5 S( }, q) u1 Y0 G% zend k* v' n, m9 D( M; J. r4 p
end5 g7 R3 A2 V* H; s* I6 z) K Y
9 k7 @* ]1 k1 V 9 W7 a" s; W, @- x. L# A7 @8 K$ S, Gfunction nc=isncf(w,k) ( B/ G8 n" l# L( F f nc=[];4 s& W; x' {+ }7 t' k. Q
t=zeros(size(w)); ; `/ r. r/ |; ^5 x1 G$ K$ a4 S! { n=size(w,1); C- a4 l0 v9 V2 w$ Y1 {8 X) d F a=find(w~=0); , {0 K$ k/ i8 Y# r5 Z% [* K4 L+ S3 F/ U for i=1:length(a)/ _. N* c0 n0 V; t
d(i)=w(a(i)); 4 S7 I: U( q$ x. _$ k' ?( a( o+ [5 W if a(i)/n>floor(a(i)/n)1 M9 ~: B% V% j! C2 L: R2 \* e
t(i)=floor(a(i)/n)+1; 8 w3 I& D6 S, Y+ n else 1 S$ E5 F3 J) h4 }9 u7 T; u8 A t(i)=floor(a(i)/n);1 Z. q. h0 p6 i8 l# d3 n
end0 P) |8 m7 }! l' i9 P
t1(i)=mod(a(i),n); 1 \$ I2 l& D# D% j; c' h if t1(i)==0" [+ I2 o4 f3 E5 b, b: P
t1(i)=n; . a3 \7 ~, c& {! g/ m7 L end : A( _5 i. y- s. P end ' g' B6 O6 W& q) |( k& ^ [b,c]=sort(d);+ Q2 E" |1 s- c/ S0 B, y$ h* @" ~
p=[1];pc=0;( r1 r6 g: |5 ]1 r3 ]1 W6 l2 c
for i=1:length(a)& u& _# ?# f; O# L$ Y/ O
if k(t1(c(i)))<k(t(c(i))) r% D, n% t( T, D% M: S3 E: ? p=union(p,t(c(i)));" H& Y) A. P- J) N* y
t(t1(c(i)),t(c(i)))=3; ) M( T: r$ _! ^+ u6 A. }8 y end 5 H9 V' z* L- G5 c% s if pc==0 7 b# q5 x# z) A1 G8 u0 L) e/ K tc=isempty(setdiff([1:n],p));, L% F- z/ N! J2 n
if tc & M9 ?* j( r* F! r- }% n7 ? t0=sum(t(1,==3); & k, \' }6 l) o( L if t0>=2 Q4 M W7 M4 U4 |. F. b- `& v nc=union(nc,1);4 u* X9 m* t! K: T9 @5 q- E
end ; e3 U- C3 s0 p- ^2 g: Q break; % z( y" [3 z! `( c$ E" b end 9 n* v) z3 {$ Y! W" F* i9 K end Y% I3 |1 n1 ]) A+ ^! H3 Q end 3 L6 a ?2 T6 _+ c4 Y& u8 |7 ? " `" E( g" X3 { : l' B; ^- _/ s9 B
end