1.问题分析

要想解决最大团问题,也就是求最大完全子图。我们需要了解相关概念,现在有如下图:

(1)完全子图:

给定无向图G=(V,E),其中V是顶点集,E是边集。G'=(V',E')如果顶点集V'∈V,E'∈E,且G'种任意两个点有边相连,则称G'是G的完全子图。例如下面的几个图都是上图的完全子图:

(2)团:

G的完全子图是G的团,当且仅当G'不包含在G的更大的完全子图中,也就是说G'是G的极大完全子图。比如图中(c),(d)是G的团,而(a)(b)不是G的团,因为他们包含在G的更大的完全子图(c)中。

(3)最大团:

G的最大团是指G的所有团中,含顶点数最大的团,比如说(d)就是最大团。

2.算法设计

(1)约束条件:

最大团问题的解空间包含2^n个子集,这些子集存在集合中的某两个结点没边相连的情况。显然这种情况的可能姐不是问题的可行解,故需要设置约束条件来判断是否有情况可能导致问题的可行解。

假设现在扩展结点到t层,那么1~t-1个结点状态(是否已经在团里)已经确定。接下来沿着扩展点左分支进行扩展,此时需要判断是否将 t结点 放进团里。则判断 t结点 和1~t-1 个结点中被选中的结点是否有相连,相连就放进团里,x[t]=1,否则不放进团里,x[t]=0.如图所示:

(2)限界条件(剪枝函数):

假设当前的扩展结点为z,如果z处于第t层,前面1~t-1 层的结点的状态已经确定了。接下来确定t结点的状态。前t个结点状态确定当前已放团内的结点个数(用cn表示),假设t+1 ~ n 的所有结点都放进团,用fn表示,且fn=n-t ,则cn+fn是所有从根出发的路径中经过中间结点z的可行解所包含结点个数的上界。

如果fn+cn小于等于当前最优解bestn,则说明不再需要从中间结点z继续像子孙结点搜索。因此,限界条件可以描述为:cn+fn>bestn。

(3)搜索过程:

从根节点开始,以深度游戏按的方式进行。每次搜索到一个结点,判断约束条件,看是否可以将当前结点加入到团中。如果可以,则沿着当前结点左分支继续向下搜索,如果不可以,判断戒指函数,如果满足则沿着当前结点的右分支继续向下搜索。

3.源代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=111; //设置矩阵的大小
int graph[N][N]; //用邻接矩阵存储图
bool x[N]; //是否将i个顶点加入团中
bool bestx[N]; //记录最优已经放入团中的顶点
int bestn; //记录最优值
int cn; //已经放入团中的结点数
int n;//顶点个数
int m; //边的个数bool place(int t) //判断是否能放进团中
{bool OK =true;for (int j=1;j<t;j++)  //判断目前扩展的t顶点和前面t-1个顶点是否相连。{if(x[j] && graph[t][j]==0) //如果不相连{OK=false; //返回falsebreak;}}return OK; //如果相连。返回true
}void backtrack(int t) //回溯,递推
{if(t>n) //当到达叶子结点{for(int i=1;i<=n;i++){bestx[i]=x[i]; //记录最优值结点号}bestn=cn; //记录最优值return;}if(place(t)) //如果能放进团中{x[t]=1;//标为1cn++; //个数+1backtrack(t+1); //向下递推cn--; //向上回溯}if(cn+n-t>bestn) //限界条件,进入右子树,不能加入团中。{x[t]=0; //不能放入团中,标为0backtrack(t+1); //向下递推。}
}int main()
{int u; //结点1int v; //结点2cout << "请输入结点的个数n;"<< endl;cin >> n;cout << "请输入边数m:"<< endl;cin >>m;memset(graph,0,sizeof(graph));cout <<"请输入有边相连的两个顶点u和v:"<< endl;for (int i=1;i<=m;i++){cin >> u>> v;graph[u][v]=1;graph[v][u]=1;}bestn=0;cn=0;backtrack(1);cout << "最大团的结点个数有:"<< bestn << endl;cout << "结点有:"<< endl;for (int i=1;i<=n;i++){if(bestx[i]){cout << i << "  "; //输出的是结点号}}return 0;
}

4.测试结果

回溯、图论——最大团问题(求最大完全子图)相关推荐

  1. 回溯法——最大团问题

    回溯法--最大团问题 问题: 给定无向图G=(V,E).如果U∈V,且对任意u,v∈U有(u,v)∈E,则称U是G的完全子图. G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中. G的最大 ...

  2. 回溯法--最大团(部队护卫队问题)

    package com.duoduo.day316; /*** 回溯法--最大团问题* 问题描述:为组织一支队伍,希望选出最多的居民加入队伍中,并保证其中任意两人均不是仇敌,给定仇敌关系图,计算构建护 ...

  3. 图论 —— 最大团问题

    [问题描述] 当 G′ 是图 G 的子图,且 G′ 是关于 V′ 的完全图时,子图 G' 为图 G 的团:当 G' 是团,且不是其他团的子集时,G' 为图 G 的极大团:当 G' 是极大团时,且点数最 ...

  4. 图论——最大团问题和最大独立集、二分图相关

    文章目录 最大团问题和最大独立集 二分图.用网络流解决最大二分匹配的方法 一种另类的增广路--交替路.匈牙利算法 一般图.二分图中的其它性质 P1640 [SCOI2010]连续攻击游戏 最大团问题和 ...

  5. c语言实现判断两个子图是否同构问题_经典问题-回溯法-最大团问题

    1. 知识点 注:用回溯法实现最大团问题和用回溯法实现装载问题,解决方案和复杂度是类似的.如果你对回溯法或者子集树问题,并不了解,可以参看一下这篇文章,里面补充了回溯法和子集树的概念. 装载问题-回溯 ...

  6. 图论 最大团,最大独立集

    经典的NP完全问题,只有暴力解,时间复杂度O(n2^n) 对于无向图来说 所谓最大团, 其实就是找一个最大完全子图,最大就是包含的点最多. 而最大独立集 == 补图的最大团 这里使用深度优先搜索实现, ...

  7. 图论 —— 网络流 —— 最小割 —— 最大权闭合子图

    [概述] 给出一个有向图,每一个点都有一个权值,现在要选择一个权值和最大的子图,使得每个点的后继都在子图中,这个子图就称为最大权闭合子图. 如上图,能选的子图有:Ø.{1,2,3,4,5,6}.{3, ...

  8. 【UOJ168】元旦老人与丛林【图论证明】【最大权闭合子图】【dinic动态推流】

    题意:给一张无向图,判断能否分成两个生成森林. n≤2×103,m≤4×103n\leq 2\times 10^3,m\leq 4\times 10^3n≤2×103,m≤4×103 题目中这样的图称 ...

  9. 用回溯法求子集和的c++代码

    用回溯算法解决问题的一般步骤为: 一.定义一个解空间,它包含问题的解. 二.利用适于搜索的方法组织解空间. 三.利用深度优先法搜索解空间. 四.利用限界函数避免移动到不可能产生解的子空间. 问题的解空 ...

最新文章

  1. CISCO路由器TELNET和SSH远程登录配置实例
  2. File类3 文件读取
  3. python生词本的生词_【Anki小工具】有道生词本转Anki 1.0
  4. 华农java实验7_国家实验教学示范中心
  5. base64是哪个jar包的_涨知识 | 用maven轻松管理jar包
  6. MTK:屏幕模板机制
  7. 经济学的概念、术语与常识
  8. c# 获取docx中的内容
  9. 理解SpringAOP-菜鸟新手入门
  10. 学习笔记之30个常用的maven命令
  11. 软件是计算机所需要的程序,软件是指电脑运行所需要的各种程序及其有关资料.doc...
  12. collect2: error: ld returned 1 exit status(解决方案大总结)
  13. Mac Xshell 下载 (FinallShell)
  14. 【毕业设计】基于单片机的心率检测系统 - stm32 物联网 嵌入式
  15. 数据恢复软件从iOS恢复Safari浏览记录
  16. hadoop离线阶段(第十三节)数据仓库、hive简介、hive安装和hive的三种交互模式
  17. 欧拉函数和莫比乌斯反演(Mobius)
  18. 群晖(docker图形化界面)使用 SpeedTest 测速
  19. 小红书竞品分析_小红书与网易考拉 竞品分析报告
  20. SpringBoot + 秒杀系统

热门文章

  1. 批处理一键提取360全家桶推送壁纸附获取方法源码
  2. 5G基站射频传导测试研究与应用
  3. Vue3+Vite项目使用mockjs模拟数据
  4. win7怎么连接不上宽带连接服务器未响应,win7宽带自动断开连接怎么办 win7宽带连接不上的快速解决方法...
  5. 树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息
  6. 【观察】用友“SaaS+PaaS+生态”再提速,以“平台”模式赋能成长型企业
  7. MT6771/6761/6762 安卓手机主板 dconfig 控制 mrdump 开关去除 SOCID 绑定
  8. Java实现单播,组播,广播
  9. 打印机中的废墨收集垫已到使用寿命怎么办
  10. 三维粒子特效ae插件Trapcode Particular有效注册版