一.问题描述

给定无向图G=(V, E), U⊆V, 若对任意u, v∈U, 有(u,v) ∈ E, 则称U是G的一个完全子图.
G的完全子图U是G的一个团当且仅当U不包含在G的更大的完全子图中,G的最大团是指G中所含顶点数最多的团.

二.解题思路

无向图G的最大团和最大独立集问题都可以用回溯法在O(n2^n)时间内解决.图G的最大团和最大独立集问题都可以看做图G的顶点集V的子集选取问题.因此,我们可以用子集树表示问题的解空间.

解最大团问题的回溯法和解装载问题的回溯法十分相似.设当前扩展结点Z位于解空间树的第i层.在进入左子树前,必须确认还有足够多的可选择顶点,使得算法有可能在右子树中找到更大的集.

具体代码如下:

// 最大团问题
#include<bits/stdc++.h>
using namespace std;
class Clique
{friend int MaxClique(int **, int *, int);private:void Backtrack(int i);int **a,        //图G的邻接矩阵n,          //图G的顶点数*x,         //当前解*bestx,     //当前最优解cn,         //当前顶点数bestn;      //当前最大顶点数
};
void Clique::Backtrack(int i)   //计算最大团
{static int k = 1;if(i > n){cout<<"第"<<k++<<"次到达叶节点,此时的到最大团顶点数为:"<<cn<<endl;cout<<"顶点选择情况为:";for(int j=1; j<=n; j++){bestx[j] = x[j];cout<<x[j]<<" ";}cout<<endl;bestn = cn;return ;}//检查顶点i与当前团的连接bool CanSelect = true;for(int j=1; j<i; j++){if(x[j] && a[i][j] == 0) //i与j不相连{CanSelect = false;break;}}if(CanSelect)  //进入左子树{x[i] = 1;cn++;cout<<"进入左子树深入一层,将到达第"<<i+1<<"层"<<endl;Backtrack(i+1);cout<<"从左子树回溯一层,将到达第"<<i<<"层"<<endl;x[i] = 0;cn--;}else cout<<"顶点i不与当前团处于连接状态,所以尝试往右"<<endl;if(cn+n-i >= bestn)  //如果右子树中剩余所有结点个数加起来大于等于当前最大顶点数,那么进入右子树.{cout<<"进入右子树深入一层,将到达第"<<i+1<<"层"<<endl;x[i] = 0;  //该句可要可不要Backtrack(i+1);cout<<"从右子树回溯一层,将到达第"<<i<<"层"<<endl;}else cout<<"右子树中剩余所有顶点数加上当前已经选择的顶点数一共为:"<<cn+n-i<<"  小于当前最大顶点数:"<<bestn<<",直接剪枝.";
}
int MaxClique(int **a, int *v, int n)
{Clique Y;//初始化YY.x = new int[n+1];Y.a = a;Y.n = n;Y.cn = 0;Y.bestn = 0;Y.bestx = new int[n+1];Y.Backtrack(1);delete[] Y.x;return Y.bestn;
}
int main()
{cout<<"请输入顶点个数:";int n;while(cin>>n && n){cout<<"请输入邻接矩阵"<<endl;int **a = new int*[n+1];for(int i=0; i<=n; i++) a[i] = new int[n+1];for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)cin>>a[i][j];int *v = new int[n+1];for(int i=0; i<=n; i++) v[i] = 0;int ans = MaxClique(a, v, n);cout<<"最大团中顶点个数为:"<<ans<<endl;for(int i=0; i<=n; i++) delete[] a[i];delete[] a;cout<<"请输入顶点个数:";}system("pause");return 0;
}

运行结果如下:

由此构建出的的子集树为:

应该比较清晰,大家可以试着自己画一画.

参考毕方明老师《算法设计与分析》课件.

欢迎大家访问个人博客网站—乔治的编程小屋,一起加油!

回溯算法 --- 例题6.最大团问题相关推荐

  1. 回溯算法团灭子集、排列、组合问题

    回溯算法团灭子集.排列.组合问题 一.子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] ...

  2. 五大常用算法——回溯算法详解及经典例题

    回溯算法 1.回溯算法就是一种有组织的系统最优化搜索技术,可以看作蛮力法穷举搜索的改进.回溯法常常可以避免搜索所有可能的解,所以它适用于求解组织数量较大的问题. 2.首先我们先了解一下一个基本概念&q ...

  3. n皇后问题python_N皇后问题—回溯算法经典例题

    N 皇后是回溯算法经典问题之一.问题如下:请在一个 ni n 的正方形盘面上布置 n 名皇后,因为每一名皇后都可以自上下左右斜方向攻击,所以需保证每一行.每一列和每一条斜线上都只有一名皇后. 最简单的 ...

  4. [LeetCode] 回溯算法

    回溯法 回朔法的思想: 通过枚举法,对所有可能性进行遍历. 但是和枚举法不同的是回溯法不是一直遍历下去,而是在不满足条件是回退一步,去尝试其余的路,而回退的这一步就是回溯算法的关键. 因此回朔法可以简 ...

  5. 人工智能实现a*算法解决八数码_小白带你学回溯算法

    微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法 上一期算法回顾--贪婪法:https://mp.weixin.qq. ...

  6. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  7. 贪心算法+回溯算法+动态规划

    一.贪心算法 1.分饼干问题 #思路:排序加贪心 先让胃口小的孩子满足 class Solution:def findContentChildren(self, g, s):print('==g:', ...

  8. 回溯法遵循深度优先吗_回溯算法(一)

    一.什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.许多复杂的,规模较大的问题 ...

  9. 回溯法基本思想_回溯算法(一)

    一.什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.许多复杂的,规模较大的问题 ...

  10. C++算法学习(回溯算法)

    回溯算法 1.目标 2.方法 3.具体思路 4.例题 (1)[力扣:10. 正则表达式匹配](https://leetcode-cn.com/problems/regular-expression-m ...

最新文章

  1. 下一代 Service Mesh -- istio 架构分析
  2. R语言包_rCharts
  3. HK2000 V2版本 GPRS通讯串口说明
  4. JS调用打印机打印Web页面
  5. Python 第三方库之 Celery 分布式任务队列
  6. linux emacs命令,Linux Bash Shell 终端 Terminal Emacs 模式 常用 快捷键 命令
  7. ML、DL、CNN学习记录3
  8. SQL 复合查询条件(AND,OR,NOT)对NULL值的处理
  9. 计算机毕业设计-SSM商场餐厅管理系统-JavaWeb商场餐厅管理系统
  10. phpcms图库_love.php
  11. 遥感图像计算机自动分类原理,第30讲:8.1遥感图像自动识别分类
  12. 社区,v2ex;天才,livid and SAI
  13. 家用空气净化器除甲醛什么品牌好 能除甲醛吗
  14. 均值定理最大值最小值公式_数学均值定理怎么求不等式的最大值最小值,求教会(ฅω*ฅ)...
  15. docker使用教程
  16. Linux中Lun是什么,以及和存储卷的区别
  17. mean(求均值),max/min(求最值)
  18. linux 查看系统命令
  19. 计算机网络实验 ——wireshark抓包简要分析TCP、UDP协议
  20. matlab永磁电机模型,采用MATLAB/Simulink对永磁同步电机进行模型仿真和调速研究

热门文章

  1. Ubuntu使用问题备忘录
  2. 智慧城市发力,区块链助力土木建设数据存储
  3. 基于SBO的委外加工条码解决方案
  4. Sbo之于中国的使用现状分析
  5. 【Python 3.7】熟食店:创建一个名为 sandwich_orders 的列表,在其中包含各种三明治的名 字;再创建一个名为 finished_sandwiches 的空列表……
  6. 关于IE读取缓存页面不刷新解决方法
  7. java 实现pdf转换成图片
  8. linux幻灯片制作软件,Marp(代码制作幻灯片软件)
  9. ID3、C4.5决策树算法的Python实现(注释详细)
  10. python 股票实时数据接口_股票行情实时数据接口