问题描述:
给定一个赋权无向图 G=(V,E),每个顶点 v∈V 都有一个权值 w(v)。如果 U⊆VU⊆V,且对任意(u,v)∈E 有 u∈U 或 v∈U,就称 U 为图 G 的一个顶点覆盖。G 的最小权顶点覆盖是指 G 中所含顶点权之和最小的顶点覆盖。

算法设计:
对于给定的无向图 G,设计一个优先队列式分支限界法,计算 G 的最小权顶点覆盖。

数据输入:
由文件input.txt给出输入数据。第 1 行有 2 个正整数 n 和 m,表示给定的图 G 有 n 个顶点和 m 条边,顶点编号为 1,2,…,n。第 2 行有 n 个正整数表示 n 个顶点的权。接下来 的 m 行中,每行有 2 个正整数 u,v,表示图 G 的一条边(u,v)。

结果输出:
将计算的最小权顶点覆盖的顶点权之和以及最优解输出到文件output.txt。文件的第1行是最小权顶点覆盖顶点权之和;第2行是最优解xi(1<=i<=n),xi=0表示顶点i不在最小权顶点覆盖中,xi=1表示顶点i在最小权顶点覆盖中。

输入文件示例
input.txt
7 7
1 100 1 1 1 100 10
1 6
2 4
2 5
3 6
4 5
4 6
6 7
输出文件示例
output.txt
13
1 0 1 0 1 0 1

算法分析:

  1. 要找到最小权覆盖,要先判定该点能否加入集合,也就是判断集合V中的点是否能与U集合中的任意一点直接相连,如果当前方案不是一种顶点覆盖,直接进行剪枝。
  2. 以顶点的权重为优先级建立一个小根堆,当有活结点加入时,对点的优先级、结果向量等进行更新。每次将小根堆的堆顶结点取出进行判断。
  3. 但是无法使用界限函数对右孩子进行约束,因为如果当右孩子不加入集合U中时,那么点权和肯定更小,但是不一定能实现覆盖,所以不经过判断也要将右孩子加入到队列中去。
    顶点覆盖判断的实现:
    开辟一个数组c,用于保存与解向量x相连的顶点及其个数。令变量j从1到n,如果x[j]==0 && c[j]==0,则表示此时j结点既不是U中的点,而且也没有u中的点与其相连。
    如下图实例:

    此时解向量x={0,1,0,0,1,0,0,0}表示1,4号顶点此时加入解集合
    邻接点数组c={0,0,1,0,0,1,2,0}表示2,5,6号顶点与U集合({1,4})直接相连,且6号顶点与2个U中顶点直接相连
    满足x[j]==0&&c[j]==0(j从1到7),不是完全覆盖
    从图中可以看出不是一种完全覆盖。

    解向量x={0,0,1,0,0,0,1,0} 表示2,6号顶点加入解集合
    邻接点数组c={0,1,0,1,2,1,0,1} 表示1,3,7,4,5号顶点与U集合({2,6})直接相连,且4号顶点与2个U中顶点直接相连
    不满足 x[j]==0&&c[j]==0(j从1到7), 是完全覆盖
    从图中可以看出是一种完全覆盖,但是顶点的权值之和不一定最小。

解空间树:

每个顶点都有两种选择,加入U集合或者不加入U集合,显然进入右子树的选择一定是比进入左子树的选择所得的权值和小,但是进入右子树不一定满足顶点覆盖,所有当试探完左子树的结果后,还需进入右子树进行测试。

将每个试探的解向量加入到顶点权值小优先的优先队列,每次取出堆顶的解向量判断能否满足完全覆盖,如果能则得出最小权覆盖的解,因为堆顶解向量满足顶点权值和最小的原则,如果不能则继续取堆顶解向量判断。

优先队列存储空间示意图:

图示为优先队列结点中存储的顶点权值和及其对应的解向量与邻接点数组。

——关于源代码应该都能搜到,所以这里就不再赘述了。

最小权顶点覆盖问题分析相关推荐

  1. CodeForces - 103E Buying Sets(最小权闭合子图)

    题目链接:点击查看 题目大意:给出n个数列集合,每个集合都有一个权值,现在要求从中选出k个集合(k可以为0),要求满足: 权值和最小 k个集合取并集后的集合大小等于k 题目要求输出最小权值和 题目分析 ...

  2. HDU - 3488 Tour(二分图最小权匹配+KM)

    题目链接:点击查看 题目大意:给出n个城市,再给出m条有向的道路,问若想以一个或多个环的形式遍历所有的城市一次,所需要的最小权值是多少 题目分析:刚拿到这个题目是有点懵的,因为不知道题目让求什么,其实 ...

  3. POJ - 3565 Ants(二分图最小权匹配+KM+思维)

    题目链接:点击查看 题目大意:给出n个蚂蚁和n个苹果树的坐标,我们需要求出每个蚂蚁平时觅食所要去的苹果树,必须保证所有路径不能有交叉 题目分析:因为所有的边不能有交叉,所以我们选择距离最短的两个点匹配 ...

  4. POJ - 2195 Going Home(二分图最小权匹配+KM+思维建边/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*m的地图,现在有一定数量的小人要回到屋子里去,题目保证图中的小人和屋子的数量是一致的,小人回到小屋的距离是两个点坐标的曼哈顿距离,每个小屋只能容纳一个小人,现 ...

  5. ZOJ-2342 Roads 二分图最小权值覆盖

    题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...

  6. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  7. poj3686(最小权值完美匹配)

    开始理解的有点简单了,也是看了其他的博客之后发现问题的: 题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 ...

  8. HDU6346(最小权值完美匹配)

    题意:满足 xi+yj≤ai,j(1≤i,j≤n) 的约束下最大化∑ni=1xi+∑ni=1yi, 思路:采用最大权值完美匹配算法:但是现在这里是求最小权值完美匹配问题,所以只需要将权值取反最后在取反 ...

  9. HDU1533(最小权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:平时使用都是最大权完美匹配,现在这道题要求最小权 ...

最新文章

  1. 关于ASP.NET Web 部件连接的引入
  2. OpenCV代码提取:rotate函数的实现
  3. Thymeleaf 学习笔记 (5)
  4. tomcat版本号的修改
  5. 子数组和最接近零问题
  6. Gitlab+Jenkins学习之路(六)之Jenkins部署、升级和备份
  7. 使用ajax实现无刷新邮箱验证码,AJAX和WebService实现邮箱验证(无刷新)
  8. linux中利用脚本编写数组,shell脚本编程之数组
  9. 制造行业质量追溯难,看看这些一流制造企业,都怎么做质量管理?
  10. html中font size默认值,HTML basefont size 属性
  11. Linux 下载工具推荐: Motrix qbittorrent
  12. 用C++编写一个走迷宫游戏(1.0版)
  13. CHD-5.3.6集群安装
  14. 推荐:小众软件——各类软件的精品
  15. 关于抢红包的_关于抢红包的作文600
  16. BeagleBone Black 从零到一 (2 MLO、U-Boot) 转
  17. 金融工程 | 远期与期货的运用
  18. Nginx启动报错: could not open error log file: open() q unable to find local peer: 192.168.10.102:8848,
  19. Android课程设计-体育新闻app
  20. python实现自动答题详解含代码

热门文章

  1. 蚂蚁金服冯柯:下一个十年,核心自研技术将迎来黄金发展期
  2. Vantage公司增资3亿美元加强数据中心建设
  3. centos 正确 安装 jdk
  4. 微软官方Windows主题 英国之美 高分辨率的壁纸
  5. 【转】Word 2010 取消拼写/语法检查,隐藏红线/绿线
  6. Java中的自增操作符与中间缓存变量机制
  7. (转)ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 方法...
  8. 关于SQlserver数据库的加密应用
  9. 用简单的代码测一测你是否真的了解:Asp.Net中的事件和委托的实现
  10. Oracle Sql语句定时执行