边染色算法的matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记#################

  • 算法用途

给出简单图的染色数尽可能少的边染色方案

  • 算法思想

1) 从图的任意一条边染色,然后找到一条与其不相邻的边进行染色,再找与两条染色边都不相邻的一条边进行染色,直到没有可以染色的边为止;

2) 再找一条没有染色的边重复上述过程。

  • 程序参数说明

M: 任意图的邻接矩阵; 

k: 染色数

C: 染色方案

  • 算法的matlab程序详解
function [k,C] = edgecodf(M)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 边染色算法 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% 输入:     M: 邻接矩阵; 
%%%%%%%%% 输出:     k: 染色数
%%%%%%%%%            C: 染色方案
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

W = M;
n = size(M,1);              % 得到 M 的行数
W2 = W;
for i = 1:n
    for j = 1:(i-1)
        W(i,j) = 0;         % 使 W 主对角线下三角区元素全为零
    end
end
es = sum(sum(W));           % es 为 W 的总边数

C = zeros(1,es);
k = 1;                      % 初始待染色号为 1 色
Wm = W;
for i = 1:n
    for j = (i+1):n
        if W(i,j) ~= 0
            W1 = W;
            a1 = sum(sum(Wm(1:(i-1),:))); % a1 为 Wm 第1到i-1行的所有元素和
            a2 = sum(Wm(i,1:j));          % a2 为 Wm 第i行第1到i+1列的元素和
            a = a1 + a2;
            C(a) = k;                     % 将边 a 染色为 k
            W(i,j) = 0;
            W1(i,:) = 0;W1(j,:) = 0;      % 将 W1 的第i行和第j行元素变为0
            W1(:,i) = 0;W1(:,j) = 0;      % 将 W1 的第i列和第j列元素变为0
            while sum(sum(W1))
                %%%%%%%%%%%%% 找到矩阵中一个不为 0 的坐标 %%%%%%%%%%%%%
                [k1,k2] = seekco(W1);
                a1 = sum(sum(Wm(1:(k1-1),:)));% a1 为 Wm 第1到k1-1行的所有元素和
                a2 = sum(Wm(k1,1:k2));        % a2 为 Wm 第k1行第1到k2列的元素和
                a = a1 + a2;                  % 得到与已染色的边不相邻的新边 a
                C(a) = k;                     % 将新的边 a 染色为 k
                W(k1,k2) = 0;
                W1(k1,:) = 0;W1(k2,:) = 0;    % 将 W1 的第k1行和第k2行元素变为0
                W1(:,k1) = 0;W1(:,k2) = 0;    % 将 W1 的第k1列和第k2列元素变为0
            end
            k = k+1;     % 更新待染色号 k
        end
    end
end
k = k-1;
  • 程序中子程序
function [k1,k2] = seekco(W1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%% 找到矩阵中一个不为 0 的坐标 %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% 输入:     W1: 待求矩阵; 
%%%%%%%%% 输出:     k1: 非零元素的横坐标
%%%%%%%%%            k2: 非零元素的纵坐标
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[row,col] = find(W1 ~= 0);
k1 = row(1);
k2 = col(1);
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值