通过度序列生成一个随机图

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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值