d = [13,13,13,13,11,12,12,5,7,12,7,11,7,12,12,5,3,5,7,5,3,5,3,3,7,11,11];%预设的原图度序列
n = length(d);
V = [];
tab1 = [];
tab2 = [];
s=0;
count = 0;
alen = 1;
blen = 1;
vlen = 1;
for i = 1:n
s = s + d(i);%统计度序列之和存储在s变量中
end
if mod(s,2)~=0 %若s为奇数
disp('No');%尽量写详细一点啊,这个disp显得毫无诚意
return ;
end
while 1
for i = 1:n
if(d(i)<0)
disp('No');
break;
end
end
%如果所有的度都为0,则输出G
for i = 1:n
if(d(i) ==0)
count = count+1;
end
if (count == n)
G = graph(tab1,tab2); %这句为何会出错呢??? 是因为matlab版本的问题,重新安装了2018a版本就好了。
plot(G)
return;
end
end
Arr = randperm(n);
for i = 1:n
v = Arr(i);
if d(v)>0 %随机选取一个度大于0的顶点v
a = d(v); %a个与v相连的节点,度数存放在a中
d(v) = 0;
[B,I] = sort(d); %并返回最大的a个数,将d从小到大排序,B是排序后的序列,I是排序后的索引
for j = n-a+1:n %需要先将度数大的节点先链接
V(vlen) = I(j); %吧这些节点的序号全部方在V中。
vlen = vlen+1;
end
%现在看懂了一下这段代码的意思。
for k = 1:a %这个循环为什 到a
tab2(blen) = V(blen); %这些是节点数大的那些节点序号,这些节点也是哪些被链接的节点序号
w = tab2(blen);
d(w) = d(w)-1; %这些节点需要被链接后需要减1
tab1(alen) = v; %这个随机数
alen = alen+1;
blen = blen+1;
end
end
i = i+1;
end
end
原文链接出处:https://blog.csdn.net/qq_36151472/article/details/78899449
对以上做些简要说明:
1.matlab代码中的graph函数在matlab2015版本后才出现,所以会报错。
2.tab2是存储的被连接的节点序号,而tab1则是连的节点。tab2中优先存储度较大的节点,因为这样才可以保证度数大的节点能够先被连接完。
3.tab1中的节点链接完后就被清零,而tab2中被连接的节点也相应地均减1。