最大团问题-分支限界
问题描述:
给定无向图G=(V, E),其中V是非空集合,称为顶点集;
E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。
如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图。
G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。
如果U∈V且对任意u,v∈U有(u, v)∈E,则称U是G的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。G的最大独立集是G中所含顶点数最多的独立集。
对于任一无向图G=(V, E),其补图G'=(V', E')定义为:V'=V,且(u, v)∈E'当且仅当(u, v)∈E。
如果U是G的完全子图,则它也是G'的空子图,反之亦然。因此,G的团与G'的独立集之间存在一一对应的关系。特殊地,U是G的最大团当且仅当U是G'的最大独立集。
问题定义:
解空间树中结点类型:bbnode
活结点优先队列中元素类型为 CliqueNode(cn 表示与该节点相应的团的定点数,un表示结点为根的子树中的最大顶点树的上界。level表示结点在子集空间树中所处的层次;ch 左右儿子的结点标记)
ch=1 左儿子 ch=0 右儿子
ptr 指向解空间树中相应结点的指针
cn+n-level+1表示定点数上界的un值。
代码描述:
相关结构体定义:
class bbnode{friend class Clique; private:bbnode * parent;bool LChild; }; class CliqueNode{friend class Clique; public:operator int () const {return un;} private:int cn,un,level;bbnode *ptr; }; class Clique{friend void main(void); public:int BBMaxClique(int []); private:void AddLiveNode(MaxHeap<CliqueNode> &H,int cn,int un,int level,bbnode E[],bool ch);int * * a ,n; };
AddLiveNode:将当前构造的活结点 加入到子集空间树中并插入活结点优先队列中。
void Clique::AddLiveNode(MaxHeap<CliqueNode> &H,int cn,int un,int level,bbnode E[],bool ch) {bbnode * b = new bbnode;b->parent = E;b->LChild = ch;CliqueNode N;N.cn = cn;N.level = level;N.un = un;N.Insert(N); }
算法核心代码:BBMaxClique
子集树的根节点是 初始扩展结点 cn为0
i 表示当前扩展结点的解空间树中所处的层次。
首先考察左儿子:
顶点加入当前团,检查该顶点与当前团中其他顶点是否有边相连。
都有边,可行,纳入 活结点 优先队列中,AddLiveNode(),接着考察当前扩展结点的 右儿子结点,仅当un>bestn时,右子树中可能含有最优解 ;
否则,不可行。
int Clique::BBMaxClique(int bestx[]) {MaxHeap<CliqueNode> H(1000);bbnode * E = 0;int i=1,cn = 0,bestn = 0;while(i != n+1){bool OK = true;bbnode * B = E;for(int j = i-1;j>0;B=B->parent,j--){if(B->LChild && a[i][j]==0){OK = false;break;}}if(OK){if(cn + 1 > bestn)bestn = cn + 1;AddLiveNode(H,cn+1,cn+n-i+1,i+1,E,true);}if(cn+n-i >= bestn)AddLiveNode(H,cn+1,cn+n-i+1,i+1,E,true);CliqueNode N;H.DeleteMax(N);E = N.ptr;cn = N.cn;i = N.level;}for(int j=n;j>0;j--){bestx[j] = E->LChild;E = E->parent;}return bestn; }
最大团问题-分支限界相关推荐
- 算法设计与分析期末总结
0000前言:基本是为了我自己看的一些我容易忘记的东西,为考试作准备把,主要使后半部分的知识,前半部分请看算法设计与分析阶段考总结 第五章 回溯算法是一种系统地搜索问题的解的方法.某个问题的所有可能解 ...
- 作业12——分支限界解决最大团和图m着色问题
1.问题 最大团:求一张无向图的最大团.团的定义:给定图G=(V,E),其中,V={1,-,n}是图G的顶点集,E是图G的边集,图G的团就是一个两两之间有边的顶点集合,团是G的一个完全子图.如果一个团 ...
- 分支限界——最大团问题
给定有一个无向图,找出最大团个数. 最大团也就是该图中最大的完全图(各顶点之间都有边). 算法思想:设p为所有点集的集合,依次取出p中的顶点作为团的起始点,也就是以该点为起点开始拓展,每次查看相邻顶点 ...
- 中北大学算法分析与设计实验报告六(最大团问题)
中北大学算法分析与设计实验报告六(最大团问题) 1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力. 3.训练知识点集群 (1) ...
- 2022-2028年中国团购行业投资分析及前景预测报告
[报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了团购行业相关概述.中国团购行业运行环境.分析了中国团购行业的现状.中 ...
- 消息延迟队列处理拼团时间到期
1.RabbitMqConfig /*** * 延时队列交换机* * 注意这里的交换机类型:CustomExchange* ** * @return* */ @Bean public CustomEx ...
- 飞桨领航团 x Datawhale联合Meetup来了!杭州的小伙伴可以见面了!
Datawhale线下 主办:百度飞桨,Datawhale 飞桨领航团是飞桨开发者的兴趣社区,为开发者们提供丰富的本地技术沙龙.Meetup.及线上交流平台,面向所有对人工智能及深度学习领域感兴趣的开 ...
- 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...
刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...
- HDU1530(最大团问题)
1定义: 其中,形式参数t表示第t个顶点,Place(t)用来判断第t个顶点能否放入团里.二维数组a[][]是图的邻接矩阵.一维数组x[]记录当前解.搜索到第t层时,从第1 个顶点用第t-1个顶点的状 ...
最新文章
- win10 vs2015 编译caffe2
- python第二大奇数_python-2.7 – matplotlib,包含奇数个子图
- caffe的python接口学习(8):caffemodel中的参数及特征的抽取
- 在Spring中嵌入HSQLDB服务器实例
- java session 详解
- jquery自定义一个放大镜
- ionic自动生成启动页和图标
- JVM调优日志解析分析
- Web3 是去中心化的“骗局”?
- 出于安全考虑,千万不要绕开 CORS!
- 【matlab】元胞数组的创建
- python 基础学习1
- MyEclipse2014安装aptana插件
- ug80浩强工具_浩强工具下载|浩强UG工具下载 v2.59 最新版 - 比克尔下载
- excel表转成PDF文档
- offer和面经分享(内含offer截图)
- mysql emoji 问号_mysql数据库怎么存入emoji表情,更改utf8mb4后为什么出现全是问号...
- Mac系统开发常见问题-Mac登录界面多了一个其他账户选项
- 小程序拨打电话功能,微信小程序点击手机号,拨打电话~!
- java applet插件_Atitit.java的浏览器插件技术 Applet japplet attilax总结
热门文章
- 公钥、私钥、数字签名和数字证书的概念及解密
- linux更新模块,GNOME 3.29.3 发布,大量模块更新及功能改进
- 成都东软学院php期末考试题,求大神。。。C语言期末项目答案。。。题在一楼。。。...
- 与context的关系_Go中的Context超时和关闭是如何实现的呢?
- 计算机三级嵌入式系统考试之矩阵键盘
- Java并发包下的CAS相关的原子操作
- fastapi 基础使用
- MySQL中的索引使用
- arch Linux添加源,在Arch Linux系统中使用Archlinuxcn源(清华源)的方法
- 微型计算机字长为4表示,一台微型计算机的字长为4个字节,它表示什么?