一.问题描述

给定无向图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. Markdown here 离线下载安装
  2. Git使用常见问题解决方法汇总
  3. Problem B: 故障电灯(light)
  4. 又一国产开源微内核操作系统上线!源代码已开放下载
  5. 字符串常量到底存放在哪个存储区
  6. linux7禁用ipv6,RHEL 7 及 CentOS 7 彻底禁用IPv6的方法
  7. C语言中实际参数太多,c – 宏的实际参数太多了?
  8. Java编辑环境搭建
  9. EditPlus 使用技巧集萃(转)
  10. 苹果 AirPods 只能是 iPhone 的配件吗?
  11. java 邮件发送 多人_java 发送邮件(可发送多人,抄送多人,可带附件)
  12. 【FPGA+BP神经网络】基于FPGA的简易BP神经网络verilog设计
  13. RS485_PTZ_云台控制
  14. 猿创征文 | 国产数据库之南大通用数据库详解安装和使用
  15. python 爬虫系列之极验滑块打码
  16. QLineEdit光标问题
  17. Vue上传文件 iview Upload UI 组件上传组件
  18. 处理器中的流水线技术
  19. 【中国大学MOOC】java程序设计-week3-用“埃氏筛法”求2~100以内的素数
  20. 峰火台 | 王峰精彩十问薛蛮子

热门文章

  1. 【网站点击流数据分析】01-项目业务背景
  2. EMC、EMI、EMS和ESD的定义、区别和测试项
  3. C语言编程练习:猜数游戏
  4. IT 工作中常用的英语单词
  5. 看着2022年世界杯,我无比怀念98世界杯
  6. c语言平 ac自动机,多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考...
  7. Python——第一天的Suger Rush
  8. 百度数据可视化Sugar BI — 工业零部件3D大屏(附保姆级教程)
  9. 思维方法和高效学习及记忆法总结
  10. 细胞分裂模拟(C++)