顶点覆盖问题近似计算

这是一篇关于算法分析的博客,作者分享了在解决顶点覆盖问题时,如何使用贪心和枚举算法进行近似计算。在构建无向图并标记顶点度数后,通过度数之和大于等于总边数的条件来寻找解决方案。由于递归枚举效率不高,作者期待得到改进算法的建议。

算法分析与设计老师布置的代考试作业,其中一道题目是顶点覆盖问题近似计算,想了挺长时间,想到了一个思路,感觉自己好菜。。。

Description
	无向图G=(E,V),寻找V的一个最小子集V’,使得图中所有边至少有一个顶点在集合V’中。输出V’包含的顶点数。若最优解为C,输出的近似解C*接受范围是[C, 1.5*C]。
Input
 第1行有两个正整数n和m,1<=n<=100, 1<=m<=1000,分别代表图中顶点个数和边个数。
 第2行至第m+1行分别有2个整数a[i],b[i],表示图中的一条边,其顶点编号是a[i]和b[i],编号从0开始。
Output
 第一行输出近似解正整数C*。
 接下来一行输出C*个正整数,表示每个顶点的编号,顺序任意。
Sample Input
4 5
0 1
1 2
2 3
0 2
1 3

Sample Output
2
1 2

首先构建出无向图,在构建图的同时标记每个顶点的度数,通过对题意的分析得出需找到的集合一定满足其内全部顶点度数之和大于等于总边数的结论。然后就是采用了贪心算法和枚举算法。(我觉得是贪心和枚举,具体我这个代码用到了啥我不确定,菜鸟上路,大佬勿喷)

算法过程:
第1步,将所有无向图中顶点按照其度数有大到小的顺序排列;
第2步,采用枚举法列举出所有满足度数之和大于无向图边数的集合;
第3步,每列举出一个测试集合,测试其是否满足顶点覆盖问题的要求,若满足则暂存集合;
第4步,重复2、3步,若有满足要求且集合内顶点数量更少的集合则替换掉之前的暂存集合,直到遍历完全部可能集合或者满足近似解范围为止。
import java.util.*;
public class Main {
	public static int flag;
	static ArrayList<String> map = new ArrayList<String>();					//存放所有的边
	static LinkedList<Integer> trueList = new LinkedList<Integer>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值