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);

结果

相关推荐
dragoooon3414 小时前
[优选算法专题二——NO.16最小覆盖子串]
c++·算法·leetcode·学习方法
点云SLAM14 小时前
四元数 (Quaternion)在位姿(SE(3))表示下的各类导数(雅可比)知识(2)
人工智能·线性代数·算法·机器学习·slam·四元数·李群李代数
汉克老师14 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.1.15]第二部分编程题(4 、移动石子)
c++·算法·蓝桥杯·蓝桥杯c++·c++蓝桥杯
Athenaand14 小时前
代码随想录算法训练营第62天 | Floyd 算法精讲、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结
算法·图论
qq_4335545415 小时前
C++ Dijkstra堆优化算法
开发语言·c++·算法
楼田莉子16 小时前
C++动态规划算法:斐波那契数列模型
c++·学习·算法·动态规划
1373i16 小时前
【Python】通俗理解反向传播
深度学习·算法·机器学习
Madison-No717 小时前
【C++】日期类运算符重载实战
c++·算法
cici1587417 小时前
基于K-SVD的稀疏编码去噪算法
算法
电力程序小学童17 小时前
基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning算法研究(matlab)
算法·matlab·无人机