数学建模社区-数学中国
标题:
求助关于求图割点的代码,哪里错了?怎么改正啊?
[打印本页]
作者:
ganquanlife
时间:
2013-3-3 14:54
标题:
求助关于求图割点的代码,哪里错了?怎么改正啊?
function [nc] = ncutf(g)
% a! n+ E; r( e6 w$ S. T
%求割点的算法 g为邻接矩阵 nc为割点的集合
( |6 x" D9 z& E4 z
n=size(g,1);
2 c4 \* v+ q6 R. S. D" g
if n>=3
" r% i( H5 \( P" H
a=sum(g);
- Z/ T- o6 i3 B4 I6 {' b* D( N2 `
b=sum(a==2);
' j! I2 R9 Y; {, j
if b==n
0 J- F5 z2 g; [
fprintf('本图为圈,无割点。n')
5 ]1 V8 G' N5 ~& U2 T1 ?& {7 O
nc=0;
+ V" c. Q7 Q) L# N
end
9 m# ]+ [( s- [# x' r0 P! U
else
, e; p8 H. ^* k- q a, X( g
[w,k]=dfs3(g);
% l, V( g) ]( [
%nc=[];
9 Q w m3 @7 X" n6 O) B! S" s
nc=isncf(w,k);
1 B1 M0 K b5 J; I6 l/ i
n=size(g,1);
6 l3 l, _# n, _
for i=1:n
0 D8 X2 l/ `. _0 d4 s4 D
for j=1:n
5 i# Z9 g$ K6 x* \" j
if w(i,j)>1
' E" ]) c: g' y8 Y# D
if k(i)>k(j)
6 B: |$ g5 h. }7 S( R; }3 N$ ~
g(i,j)=2;
6 I* c$ R' o! g4 Z; E8 W
else
& Z0 m( g# m/ M
g(i,j)=3;
) r# r& C0 s1 |5 l
end
; Z9 r- E f1 n# j) \
end
: ]3 M6 w" w- C# F- Y
end
& n/ h5 R# f- Y! X& D! x: z1 g
end
4 b0 w; }& P1 [" o( D, v2 ^$ c
6 K' d. z$ L' E* P" X
for i=1:n
* ^- q/ K; L0 ?$ G# ~+ q0 t
f1=find(g(i,
==2);
* B3 O E% ?2 t- ~
f2=find(g(i,
==3);
# C4 z2 ^$ N( m' T
f=union(f1,f2);
* y0 Z4 B/ C3 Y/ K& p* F! I5 O
l(i)=min([k(f) k(i)]);
: u* g4 L! {- ?) H5 z, `) w
end
* z$ C2 k2 ~# b+ [- w# o
; T4 e' u( B+ K
for i=1:n
! m9 T; R# z4 i5 \9 E" ]9 y
for j=1:n
: a% l# a5 y9 v% Q+ u
if g(i,j)==3 & k(i)>1&l(j)>=k(i)
' e& I, V% W+ M) E
nc=union(i,nc);
' P7 O s+ V6 Z% G
end
$ Y5 h* f! {6 k( t0 a
end
; ]" l+ f, c& y4 z
end
- z9 J4 X6 z" t
end
7 ~$ N( k, r) |! b! R
end
, j* {- s, C3 J: o0 S
, y, }. X% Y' g
! V3 Q. S1 L5 [
function nc=isncf(w,k)
, Z$ ]& {( K9 e& P6 k
nc=[];
. m0 m. ]2 X# u. ]: o0 d# c
t=zeros(size(w));
( Z1 R% h. t* `" G0 u
n=size(w,1);
# i# o+ G# b) e# c6 P: ~! S; E
a=find(w~=0);
% V9 Z( Z) j, W) e" _1 E
for i=1:length(a)
1 C% j/ h, o& Y, G# ^. D
d(i)=w(a(i));
) r' }3 M; u# c1 H( i7 o0 s& _
if a(i)/n>floor(a(i)/n)
0 h4 f. D* J9 y7 v) O
t(i)=floor(a(i)/n)+1;
' w$ V" y' a. l8 c* X
else
7 G( H# c4 e( j" W' N6 S/ @2 p
t(i)=floor(a(i)/n);
9 m2 Q, f/ c! G2 w5 e
end
% n! H( C8 b9 U
t1(i)=mod(a(i),n);
4 a4 x, q( K r" d }! K2 p" K
if t1(i)==0
% P! c9 Z( t4 @/ d
t1(i)=n;
+ R) G+ ^* u8 y0 e/ _
end
0 `/ E8 |; g, }* u: H- V5 T1 D) `' [
end
3 S' E% `* _9 P9 {% Y
[b,c]=sort(d);
% ~; O- g8 B0 ]- u; Q% S$ Q2 b5 g7 K
p=[1];pc=0;
9 K$ n# d6 Z; W) m2 V; C% `& `
for i=1:length(a)
( I( `) c P' G
if k(t1(c(i)))<k(t(c(i)))
4 a0 S, ?) a3 K+ X
p=union(p,t(c(i)));
}' p7 R1 ?7 e U. ^
t(t1(c(i)),t(c(i)))=3;
: w: H6 l; ~% v; J2 o: N
end
- L+ q {' @6 U( F5 f
if pc==0
8 l8 h: k6 y- P% i, Q; k5 l1 {. F
tc=isempty(setdiff([1:n],p));
& X: w9 ]9 C; U1 Z
if tc
1 c5 R+ v! h) k! f0 n- E9 Y& a/ N
t0=sum(t(1,
==3);
# R8 J' S2 Z3 {% e; q* \
if t0>=2
# t& r! U Q% p9 ]$ W/ N% {
nc=union(nc,1);
* R" o. I8 I5 F; L3 \6 o
end
D! N& ~3 I5 x9 ^" _/ i# Y
break;
( C# K; }' A8 I1 ]6 @5 H
end
( n' |9 S" @8 ~4 b
end
' {2 i+ G- C& V7 y! w0 G
end
+ S* ^$ a( R1 n/ D4 U9 A
' k$ J& p7 X* x5 m2 x
% p& |: [/ _0 S/ E
end
作者:
ganquanlife
时间:
2013-3-3 15:03
如果没法改正,另外编一个求割点的代码也行阿
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5