首页 > 编程语言 >全染色算法及其matlab程序详解

全染色算法及其matlab程序详解

时间:2024-08-27 10:26:10浏览次数:12  
标签:end 染色 k2 算法 详解 matlab W1 顶点 tc

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

  • 全染色以及全色数

图G的顶点和边满足使相邻或关联的元素得到不同的颜色,则称此染色为G的全染色;其所用最少色数称为G的全色数

  • 算法用途

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

  • 算法思想

从图上的某个顶点开始染色,然后对其不相邻的顶点进行染色(同色),再对其相关联的每条边进行染色(新色),再对其相关联的边集合中的每条边的不相邻的边进行染色。

重复以上过程。

  • 程序参数说明        

M: 任意图的邻接矩阵; 
k: 全染色数
C: 图顶点的染色方案
W: 图边集合的染色方案,以矩阵形式输出

  • 算法的matlab程序详解
function [k,C,W] = graphcodf(M)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 全染色算法 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% 输入:     M: 任意图的邻接矩阵; 
%%%%%%%%% 输出:     k: 全染色数
%%%%%%%%%            C: 图顶点的染色方案
%%%%%%%%%            W: 图边集合的染色方案,以矩阵形式输出
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

G = M;
n = size(G,1);          % n 为 G 的行数
W = G;
for i = 1:n
    for j = 1:(i-1)
        W(i,j) = 0;     % 使 W 主对角线下三角区元素全为零
    end
end
C = zeros(1,n);         % C 为1行n列的全零数组
i = 1;
k = 1;                  % 初始待染色号为 1 色
Z = [1:n];              % 建立一个1到n的数组


while sum(find(C == 0))
    %%%%%%%% 对没有染色的顶点染色 %%%%%%%%
    if C(1,i) == 0                  % 如果第 i 个顶点未被染色
        C(1,i) = k;                 % 将第 i 个顶点染为 k 色
        Sn = find(G(i,:) ~= 0);     % Sn 为 G 中第i行非零元素的索引值,即找到与当前选中点相邻的顶点
        flag = 1;
        while flag
            tc = setdiff(Z,Sn);     % tc 为在 Z 中而不在 Sn 中的元素,即找到与当前选中点不相邻的顶点
            if isempty(tc)
                flag = 0;
            else
                c = G(tc(1),:);     % c 为 G 的第 tc(1) 行
                c(1,tc(1)) = 1;     % 使 c 的 (1,tc(1)) 元素为1
                C(tc(1)) = k;       % 使数组 C 中的第 tc(1) 个元素为k,即将与选中点不相邻的顶点染成 k 色
                Sn1 = find(c ~= 0); % Sn1 为 c 中元素不为0的索引值
                Sn = union(Sn,Sn1); % Sn(新) 为 Sn 与 Sn1 的并集
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%%%%%%% 对相应的边集合进行染色 %%%%%%%%
    for j = (i+1):n
        W1 = W;
        if W(i,j) == 1                 % 寻找与顶点 i 相关联的边
            k = k+1;                   % 更新待染色号 k
            W(i,j) = k;                % 对与顶点 i 相关联的边(i,j)染色
            W1(:,i) = 0;W1(:,j) = 0;   % 将 W1 的第i列和第j列元素变为0
            W1(i,:) = 0;W1(j,:) = 0;   % 将 W1 的第i行和第j行元素变为0
            m = 0;
            while sum(sum(W1)) ~= 0 & m == 0
                c2 = find(W1 ~= 0);         % c2 为 W1 中非零元素索引值
                c3 = find(W == 1);          % c3 为 W 中元素值为1的索引值
                c4 = intersect(c2,c3);      % c4 为 c2 与 c3 中相同的元素,即找到与已染色边 (i,j) 不相邻的边
                if ~isempty(c4)             % 若 c4 非空,即找到与已染色边 (i,j) 不相邻的边
                    k1 = floor(c4(1) / n);  % 对 c4(1)/n 取余
                    k2 = mod(c4(1),n);      % 对 c4(1)/n 取模,即找到与新边相关联的顶点
                    if k2 == 0
                        k2 = n;
                    end
                    W1(k2,:) = 0;W1(:,k2) = 0;          % 将 W1 的第k2行和第k2行元素变为0
                    W1((k1+1),:) = 0;W1(:,(k1+1)) = 0;  % 将 W1 的第k1+1行和第k1+1行元素变为0
                    if k1+1 < k2
                        W((k1+1),k2) = k;
                    else
                        W(k2,(k1+1)) = k;               % 对新边进行染色
                    end
                else
                    m = 1;
                end
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    i = i+1;
    k = k+1;
end

%%%%%%%%%%%%%%%% 计算总染色数 %%%%%%%%%%%%%%%%%%%
k = k-1;
m = 0;
for i = 1:k
    t1 = find(C == i);  % 找到染色为 i 的顶点索引值集合
    t2 = find(W == i);  % 找到染色为 i 的边索引值集合
    t3 = sum(t1);
    t4 = sum(sum(t2));
    t5 = t3 + t4;
    if t5 ~= 0
        m = m+1;        % 总染色数+1
    end
end
k = m;

标签:end,染色,k2,算法,详解,matlab,W1,顶点,tc
From: https://blog.csdn.net/weixin_72217561/article/details/141595464

相关文章

  • 网络通信和TCP/IP协议详解
    目录网络协议一、计算机网络是什么?定义和分类计算机网络发展简史二、计算机网络体系结构OSI七层模型TCP/IP模型TCP/IP协议族IP、TCP和UDPTCP/IP网络传输中的数据地址和端口号MAC地址IP地址端口号综述三、TCP特性TCP三次握手为什么TCP握手需要三......
  • 【Go函数详解】二、参数传递、变长参数与多返回值
    文章目录一、传递参数1.按值传参2.引用传参2.1特殊情况2.1.1切片slice2.1.2字典map二、变长参数1.基本定义和传值1.1基本定义1.2传值1.2.1普通传值1.2.2传递切片2.任意类型的变长参数(泛型)三、多返回值1.命名返回值一、传递参数1.按值传参Go语......
  • 顶点染色算法的matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################算法用途给出简单图的染色数尽可能少的顶点染色方案算法思想从顶点度数最小的顶点开始染色,找到不与其相邻的顶点并选择其中一个顶点进行染色,再找与这两个顶点都不相邻的顶点集合,并对其中......
  • 算法与数据结构——队列
    队列队列(queue)是一种遵循先入先出规则的线性数据结构。队列模拟了排队现象,即新来的人不断加入队列尾部,而队列头部的人逐个离开。如图所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队列尾部的操作称为“入队”,删除队首元素的操作称为“出队”。队列常用操作......
  • 折腾 Quickwit,Rust 编写的分布式搜索引擎-官方配置详解
    Nodeconfiguration(节点配置)节点配置允许您为集群中的各个节点自定义和优化设置。它被分为几个部分:常规配置设置:共享的顶级属性Storage(存储)设置:在storage部分定义https://quickwit.io/docs/configuration/node-config#storage-configurationMetastore(元存储)设置:在......
  • 浅谈二分算法
    浅谈二分算法二分首先知道一下二分是什么。二分,是一种快速处理大型数据的方法。基本逻辑是折半查找。设有一个共有\(n\)个数字的数组,要从中查询某个元素,就可以用二分查找。注:这里的数组默认其成员数值具有单调性。这个点十分重要。还记得小时候(我现在才新初一)跟同学玩过一......
  • C++容器之字符串的详解
    每日诗词:我见青山我妩媚,料青山见我应如是。                             ——《贺新郎·甚矣吾衰矣》【宋】辛弃疾目录补漏:vector在分配新内存块后如何进行元素复制正文:字符串变量和常量字符串变量:解析:......
  • 结构化克隆算法是啥?
    结构化克隆算法(StructuredCloneAlgorithm)是一种用于在Web浏览器中复制复杂数据类型的方法,主要用于postMessageAPI。它允许从一个环境(如一个窗口或Worker)向另一个环境发送消息,而这些消息可以是复杂的JavaScript对象。基本原理结构化克隆算法的基本思想是在发送方创建一......
  • RIAD详解
    RAID(独立磁盘冗余阵列)是一种将多个物理磁盘驱动器组合成一个单元的技术,目的是提高性能、数据冗余性或两者兼有。以下是常见RAID级别的详细描述:1.RAID0(条带化)描述:RAID0将数据分散在多个磁盘上,没有冗余性。每个磁盘存储数据的一部分,这些部分组合在一起构成整个数据集。优点......
  • 【网络编程通关之路】 Udp 基础回显服务器(Java实现)及你不知道知识原理详解 ! ! !
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......