function [nc] = ncutf(g)* J- M; o( b6 w; I0 ?
%求割点的算法 g为邻接矩阵 nc为割点的集合/ H, E7 v1 E3 `
n=size(g,1);; }6 S2 ?$ y9 K* P/ l& V
if n>=3 o$ v9 U! O& g1 t, M
a=sum(g); 8 g |, l: ~) g4 T b=sum(a==2);* I; `" {* T8 a" B: X3 m
if b==n! {/ l9 ~- |# |1 U2 ^* l' y
fprintf('本图为圈,无割点。n') ( Y4 }" V. z* O2 x/ M nc=0; 4 I9 h8 h5 U7 n end , e2 y1 W( k; s' o' z, Z& S9 Delse & P4 N1 y! C+ E g1 { [w,k]=dfs3(g); }4 v9 J1 m" f- D; [
%nc=[]; / ?4 O) x9 M6 S+ \! n: S* H7 j nc=isncf(w,k); V+ e4 D' f: W2 r2 X
n=size(g,1); ! B4 o% U! Y: d) M* \' g L9 j for i=1:n9 L5 ^) k+ h- M2 f `8 |; H
for j=1:n9 ]( W8 H: B6 F( W
if w(i,j)>1* \; D5 a% i7 ^
if k(i)>k(j)9 B- D f) N6 T- h) Q* }3 O
g(i,j)=2; e' K2 J: i! u8 D; x& x else / q$ Z' Q/ T/ ?& `% e g(i,j)=3; ( e1 H/ ?7 ^7 M2 F& C9 @5 v5 v end+ Q8 S( C: \- m/ D1 p J8 H" j5 Q( }
end & r a/ j. x9 D end " r* F4 R, Y7 h9 ^! F$ _' ~5 G end 0 ^# A3 [5 p. ^/ n: V9 E 8 k' e( g+ u. C* \0 M
for i=1:n1 v( X9 X2 p5 Q. D8 R
f1=find(g(i,==2);) n$ D0 l g0 ?; c; Y v7 [ F7 W
f2=find(g(i,==3);( j7 C' F2 j2 B% `, p; a
f=union(f1,f2);, `# [% X; S& x5 g: G( W
l(i)=min([k(f) k(i)]); % R7 W5 W8 ? D& r' G end1 p5 e+ Z+ |8 {( f. p: D5 I
3 ]! K _+ p' i for i=1:n* [. R. a8 v, k2 b! b, _6 ~
for j=1:n + T% A0 l, }/ f8 z8 c- C if g(i,j)==3 & k(i)>1&l(j)>=k(i)1 S5 z1 J6 ]0 K3 I0 J3 u" y& p
nc=union(i,nc); . z' ~* Y3 ~' q$ v3 l Z end 8 y0 s. m( D+ ^$ f7 ?) p end7 y1 i+ V( t5 J3 u4 Z; T
end 1 M q3 H" Z. M$ Eend3 d# r6 @# ?' f) K7 J& y( F3 }" Z
end$ Q% X) `4 Z* d' ]3 W
/ F% b) F. y6 B2 G5 g 1 J, Z; Z1 Y2 g* r4 F Y0 @function nc=isncf(w,k) 9 I% R) B# p* K9 Y6 Q nc=[];; E5 v8 V {4 L" K0 {$ T# P
t=zeros(size(w)); 8 F, i- q+ d0 [# L5 a, { n=size(w,1); ' X: C; ^. U0 R5 H" Y4 T4 ? a=find(w~=0);. ~" M& @4 b+ s3 u# ^$ ^
for i=1:length(a)- o4 Q. I+ O3 ^6 \( i1 p# p
d(i)=w(a(i));# l3 x+ k: e K) o2 z( O2 N
if a(i)/n>floor(a(i)/n) 6 j" a& F3 I r( Q* T8 | t(i)=floor(a(i)/n)+1; ' j. [$ A, w0 z6 g# r( _ else. i4 U1 w6 K/ b* w6 b
t(i)=floor(a(i)/n); # F- Y. P% L+ O k; u! Z2 u end6 O! }4 P0 c' F9 ]
t1(i)=mod(a(i),n); 3 }5 k$ S% ?: T if t1(i)==0% p% I5 M$ X' E* i5 ~
t1(i)=n;( X. e6 G! v4 R- T* z$ x. ~
end 4 r( ~$ H2 P& K' x8 i' D end( T. w1 w9 v: m4 |1 f3 X
[b,c]=sort(d); " {, J5 V5 R0 G! ]! B6 {& t p=[1];pc=0; ! |1 d# i7 o3 z4 \5 k; q for i=1:length(a) 7 ^: D% z1 U+ Q$ L" U if k(t1(c(i)))<k(t(c(i)))3 t6 L+ I; V H
p=union(p,t(c(i))); - M( G: b. X* w1 x1 [2 G3 g t(t1(c(i)),t(c(i)))=3; 5 R, ]* P& ^6 F' Y% N0 t; {$ W end 9 p' N9 m( J. o7 |7 j) c6 I" f if pc==0; t. J. S! }4 F2 L' X
tc=isempty(setdiff([1:n],p)); 2 y* k1 \6 t, T if tc $ D0 ~1 K) [) T/ h$ h5 |& N: Z t0=sum(t(1,==3); - F B% G: C7 a- {- M if t0>=2 + ?/ l8 G. S/ W R3 u& R. j nc=union(nc,1);8 ` s9 }4 Y' U7 w& p
end 4 I9 T) t: G6 ?2 ~* w6 r' x. {" v break; $ e0 r. V) k; L6 c end / T, w" {7 f ~; S1 t _) A end, L/ r* x0 Q3 \7 U3 y
end 1 b3 B+ E% b1 C 0 W$ i- @; @+ V8 m9 ^; n 0 S6 ~, G. X* K9 T+ A9 s
end