matlab-贪婪算法寻找最小覆盖

文章目录


一、最小结点集是什么

最小覆盖集 (也称为最小点覆盖集)是图论中的一个重要概念,指的是一个节点子集,使得图中的每一条边都与这个子集中的至少一个节点关联。简单来说,最小覆盖集是一个节点集合,它能够"覆盖"或"触及"到图中的每一条边。

二、贪婪算法实现查找最小结点集

代码

matlab 复制代码
function S = greedyVertexCover(A)  
    % greedyVertexCover: 使用贪心算法找到一个图的顶点覆盖集  
    % A: 图的邻接矩阵,其中A(i,j)=1表示顶点i和顶点j之间有边相连,A(i,j)=0表示没有边  
    % S: 找到的顶点覆盖集  
  
    % 获取图的顶点数  
    n = size(A, 1);  
      
    % 初始化顶点覆盖集S为空  
    S = [];  
      
    % 初始化所有边都未覆盖  
    edgesToCover = A;  
      
    % 当还有未覆盖的边时  
    while ~all(edgesToCover(:) == 0) % 检查是否所有边都已被覆盖  
        % 找到一个未覆盖边数最多的顶点(贪心选择)  
        maxEdges = 0;  
        v = 0;  
          
        % 遍历所有顶点  
        for i = 1:n  
            % 如果顶点i还未在S中且至少有一个相邻边未覆盖  
            if ~any(S == i) && any(edgesToCover(i, :))  
                % 计算顶点i覆盖的未覆盖边数  
                numCovered = sum(edgesToCover(i, :));  
                % 如果顶点i覆盖的未覆盖边数多于当前最多的,则更新  
                if numCovered > maxEdges  
                    maxEdges = numCovered;  
                    v = i;  
                end  
            end  
        end  
          
        % 确保v是一个有效的正整数索引  
        if v > 0 && v <= n  
            % 将选择的顶点v加入顶点覆盖集S  
            S = [S, v];  
              
            % 标记与顶点v相邻的边为已覆盖  
            edgesToCover(v, :) = 0; % 设置为0表示边已被覆盖  
            edgesToCover(:, v) = 0; % 对于无向图,双向标记  
        else  
            error('无法找到有效的顶点索引v'); % 如果v无效,则抛出错误  
        end  
    end  
end  
  
matlab 复制代码
% 示例:创建一个图的邻接矩阵并找到其顶点覆盖集  
% 邻接矩阵表示的图  
A = [0 1 1 0 0;  
     1 0 1 1 0;  
     1 1 0 1 1;  
     0 1 1 0 1;  
     0 0 1 1 0];  
  
% 调用函数找到顶点覆盖集  
S = greedyVertex(A);  
disp('Vertex Cover Set:');  
disp(S);

结果

相关推荐
tt55555555555524 分钟前
每日一题-判断是不是完全二叉树
数据结构·算法
君义_noip1 小时前
信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2
算法·动态规划·信息学奥赛·斜率优化
因兹菜2 小时前
[LeetCode]day4 977.有序数组的平方
数据结构·算法·leetcode
weixin_537590452 小时前
《C程序设计》第六章练习答案
c语言·c++·算法
码农小苏242 小时前
K个不同子数组的数目--滑动窗口--字节--亚马逊
java·数据结构·算法
独自破碎E3 小时前
【4】阿里面试题整理
java·开发语言·算法·排序算法·动态规划
涛ing8 小时前
32. C 语言 安全函数( _s 尾缀)
linux·c语言·c++·vscode·算法·安全·vim
xrgs_shz9 小时前
MATLAB的数据类型和各类数据类型转化示例
开发语言·数据结构·matlab
独正己身9 小时前
代码随想录day4
数据结构·c++·算法
利刃大大12 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝