最大团问题-分支界限法

  1. 遍历所有点构造二叉树;

  2. 广度遍历树,遍历过程中判断当前结点的点数据时,是否构成完全子图,如果不能则只将右结点加入队列,每次选取队列中完全子图最大的结点作为活结点,无子结点时到达叶子结点,记录为一个完全子图,优先队列法中第一个完全子图即为最优解。

package test;import java.util.*;/*** Created by saishangmingzhu on 2018/12/10.* 最大团问题*/
public class MaximumCliqueProblem {//图private int[][] pointIndex=new int[][]{{1,1,0,1,1},{1,1,1,0,1},{0,1,1,0,1},{1,0,0,1,1},{1,1,1,1,1}};public static void main(String[] arg){new MaximumCliqueProblem().branchAndBoundMethod();}/*** 分支界限法-优先队列式* 优先队列式求解时,到达第一个没有子结点的活结点时,即为最优解*/public void branchAndBoundMethod() {List<Point> pointList=new ArrayList<>();pointList.add(new Point("1",0));pointList.add(new Point("2",1));pointList.add(new Point("3",2));pointList.add(new Point("4",3));pointList.add(new Point("5",4));//【1】构建树Node root=new Node();createTree(pointList, root,0);//【2】广度遍历List<Node> currentLiveNodeList=new ArrayList<>();currentLiveNodeList.add(root);while (true) {//排序Node parent = currentLiveNodeList.get(0);if (parent.leftNode==null){//表示到了叶子结点,进行记录//点不算子图,所以要去除点集为1的叶子break;}List<Point> leftPointList = parent.leftNode.hasPointList;if (judge(leftPointList) != 0) {currentLiveNodeList.add(parent.leftNode);}//因为右结点是空,所以不需要判断//List<Point> rightPointList=parent.rightNode.hasPointList;currentLiveNodeList.add(parent.rightNode);currentLiveNodeList.remove(parent);Collections.sort(currentLiveNodeList, new Comparator<Node>() {@Overridepublic int compare(Node o1, Node o2) {return o2.hasPointList.size()-o1.hasPointList.size();}});}System.out.println("最大团");for (Point point:currentLiveNodeList.get(0).hasPointList){System.out.print(point.name+",");}}/*** 判断现有节点是否是完全子图 -1 表示不是* @param pointList* @return*/private int judge(List<Point> pointList){for (int i=0;i<pointList.size();i++){Point pointi=pointList.get(i);int indexi=pointi.index;for (int j=i+1;j<pointList.size();j++){Point pointj=pointList.get(j);int indexj=pointj.index;//使用[indexi][indexj]是为了说明问题,可以直接使用[i][j]if (pointIndex[indexi][indexj]!=1){return 0;}}}return 1;}private void createTree(List<Point> pointList, Node parent,int i) {if (i>=pointList.size()){return;}Node leftNode=new Node();leftNode.hasPointList.addAll(parent.hasPointList);leftNode.hasPointList.add(pointList.get(i));i++;createTree(pointList,leftNode,i);parent.leftNode=leftNode;Node rightNode=new Node();rightNode.hasPointList.addAll(parent.hasPointList);createTree(pointList,rightNode,i);parent.rightNode=rightNode;}class Point{private String name;private int index;public Point(String name,int index) {this.name = name;this.index = index;}}class Node{private Node leftNode;private Node rightNode;private List<Point> hasPointList=new ArrayList<>();}
}

转载于:https://blog.51cto.com/zuohao1990/2328591

最大团问题-分支界限法相关推荐

  1. 从0-1背包问题学习回溯法、分支界限法、动态规划

    一.0-1背包问题的描述 下面将使用回溯法.分支界限法.动态规划法来分析和解决此问题. 二.回溯法 (1)算法步骤 (2)代码如下(没有裁剪函数): 用i和n来判断结束与否,是因为解空间结构是完全二叉 ...

  2. 算法分析与设计第二版(李春葆)第六章分支界限法

    分支界限法类似于回溯法,一般回溯法目标是找出所有解,二分支界限法是找出满足条件的一个解或者最优解 算法 解空间树搜索方式 存储结点的常用数据结构 结点存储特性 常用应用 回溯法 深度优先搜索 栈 活结 ...

  3. 单源路径分支界限java_单源最短路径-分支界限法

    单源最短路径-分支界限法-优先队列式.这里使用无回路的有向图,便于构建树.构建好树后,从根结点作为起始源,加入结点队列,然后判断获取队列中最短的路径结点做为活结点,将活结点的所有子结点加入队列,移除活 ...

  4. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

  5. 算法分析课设(十一)博物馆守卫问题、世界名画陈列馆问题(分支界限法)

    免责声明 不想打字了.. 题目 在某博物馆中摆放了非常重要的文物,为了节省人力,该博物馆专门购买了警卫机器人来看管这些文物.该博物馆的房间排列整齐,房间的大小相同.每个警卫机器人能够巡查的范围除本身所 ...

  6. 算法设计-分支界限法——装载问题

    算法介绍 分支界限法: 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树. 在分支限界法中,每一个活结点只有一次机会成为扩展结点.活结点一旦成为扩展结点,就一次性产生其所有儿 ...

  7. 旅行售货员问题 java_旅行售货员问题-分支界限法

    旅行售货员问题分支界限法 package test; import java.util.ArrayList; import java.util.Collections; import java.uti ...

  8. 分支界限法0 1背包 c语言,分支限界法之布线问题(1)

    一.要求: 1.输入电路板区域n*m以及布线的起始位置和结束位置: 2.输出布线方案: 3.可以使用c或者vc实现 二.问题分析及实验原理: 在n*m的方格阵列中存在封锁区域(布线时必须绕开的区域), ...

  9. TSP旅行商问题之分支界限法法求解(C语言)

    #include <stdio.h> #include <malloc.h>#define NoEdge 1000struct MinHeapNode {int lcost; ...

最新文章

  1. java集群调度_Cuckoo-Schedule
  2. 在WPF中,如何得到任何Object对象的XAML代码?
  3. oracle asm盘符变了,使用multipath创建ASM磁盘的奇怪现象
  4. java标记错误_标记电子邮件Java时出错
  5. 前端学习(2887):如何短时间内实现v-for createApp解决方案
  6. 思想一碰就冒火: 开源贡献须耐心, 选择框架要谨慎
  7. 大数据-数据抽取(数据降维)算法
  8. 基于Matlab的标记分水岭分割算法
  9. (转)区块链上的股市:十年后传统股市还会存在吗?
  10. dotnetfx40lp 不能安装在d盘_使用小白一键重装系统给电脑安装双系统教程
  11. 微信小程序获取公众号文章列表及显示文章
  12. 基于python的大数据分析基础及实战pdf下载_Cloudera Hadoop大数据平台实战指南 PDF 下载...
  13. 25 岁的 Linux 已经无处不在,它是如何毁了微软统治世界的计划?
  14. VMware虚拟机中XP系统激活及上传文件
  15. 青春使命网页制作html,青春使命句子
  16. 亚马逊dynamo高可用性关键字仓库
  17. 无处不在的内存泄漏-苹果BUG?
  18. 堆、栈、队列的区别和联系
  19. pageContext
  20. PHP CURL 账号密码 添加授权Authorization头Header

热门文章

  1. git config设置用户名_hexo和git搭建博客过程
  2. 手机html图片模糊,css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题_html/css_WEB-ITnose...
  3. python 监控股价 程序 tk_linux通过python监控股票股价
  4. sql int 转string_SQL智能代码补全引擎【sql-code-intelligence】介绍
  5. python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...
  6. 【完结】如何学习AutoML在模型优化中的应用,这12篇文章可以作为一个参考
  7. 【知识星球】剪枝量化初完结,蒸馏学习又上线
  8. php和asp.net下SQLite3的执行速度对比
  9. 携手长江天成转型 谋定·农业大健康-林裕豪:升级山茶油农产品
  10. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面