回溯法——最大团问题

问题:

给定无向图G=(V,E)。如果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=(V1,E1)定义为:V1=V,且(u,v)∈E1当且仅当(u,v)∉E。

求原图的最大独立集等价于求补图的最大团。无向图G的最大团和最大独立集问题可以看作是图G的顶点集V的子集选取问题。如同装载问题。

分析:

与装载问题是类似的,都是1-0子集树。约束函数:每个选了的顶点之间两两相连。限制函数:已经选了的点加上剩下的点大于当前的最优解。

代码:

#include <bits/stdc++.h>using namespace std;#define MAXN 105// 用邻接矩阵来存储图
int m[MAXN][MAXN];// 最优解
int bestGroup = -1;// 结果记录数组
int res[MAXN];// 最终结果数组
int bestRes[MAXN];// 约束函数
bool constrain(int pos){for(int i = 1;i <= pos;i++){if(res[i]){for(int j = 1;j <= pos;j++){if(j == i) continue;if(res[j] && !m[i][j]){return false;}}}}return true;
}// 计算当前解
int sum(int pos){int tmp = 0;for(int i = 1;i <= pos;i++){if(res[i]) tmp++;}return tmp;
}// 限界函数
bool bound(int pos,int n){return sum(pos) + n - pos > bestGroup;
}// 递归求解最大团问题
void maxGroupTraceback(int pos,int n){// 找到了一个最优解if(pos > n){bestGroup = sum(n);for(int i = 0;i <= n;i++)bestRes[i] = res[i];}else{// 左子树res[pos] = 1;if(constrain(pos)){maxGroupTraceback(pos+1, n);res[pos] = 0;}res[pos] = 0;if(bound(pos,n)){maxGroupTraceback(pos+1, n);}}
}int main(){int n = 5;memset(m, 0, sizeof(m));memset(res, 0, sizeof(res));memset(bestRes, 0, sizeof(bestRes));m[1][2] = 1;m[1][4] = 1;m[1][5] = 1;m[2][3] = 1;m[2][5] = 1;m[3][5] = 1;m[4][5] = 1;m[2][1] = 1;m[4][1] = 1;m[5][1] = 1;m[3][2] = 1;m[5][2] = 1;m[5][3] = 1;m[5][4] = 1;maxGroupTraceback(1, n);for(int i = 1;i <= n;i++){if(bestRes[i]) cout<<i<<" ";}cout<<endl<<bestGroup<<endl;
}

回溯法——最大团问题相关推荐

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

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

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

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

  3. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

  4. 回溯法 -数据结构与算法

    1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术 ...

  5. 用c语言验证装载问题 回溯法,《算法分析与设计》期末考试复习题纲(完整版)...

    <算法分析与设计>期末复习题 一.选择题 1. 算法必须具备输入.输出和( D )等4个特性. A.可行性和安全 性 B .确定性和易读性 C.有穷性和安全 性 D .有穷性和确定性 2. ...

  6. 回溯法解决部落冲突问题

    回溯法解决部落冲突问题 实验内容 问题描述 思路分析 方法步骤 实验代码 实验内容 原始部落byteland中的居民为了争抢有限的资源,经常发生冲突.几乎每个居民都有它的仇敌.部落酋长为了组织一支保卫 ...

  7. 回溯法(算法分析与设计)

    0.回溯法的算法框架 A.简介 回溯法,又称试探法.一般需要遍历解空间,时间复杂度概况:子集树Ω(2^n),排序树Ω(n!),暴力法 B.回溯法解题三步骤 1)定义问题的解空间 如0-1背包问题,当n ...

  8. 计算机算法设计与分析(第五版)---王晓冬--------前六章(递归与分治,动态规划,贪心算法,回溯法,)期末复习资料总结

    --1--  算法:解决问题的一种方法或者一个求解过程 是若干指令的序列 输入 输出 有限性 确定性 程序:用某种设计语言对算法的具体实现 可以不满足 有限性 程序 = 算法+数据结构 果子合并问题( ...

  9. 回溯法-子集树排序树满m叉树

    回溯法是在仅给出初始节点.目标节点及产生子节点的条件的情况下,构造出一个图,然后按照深度优先搜索的思想,在有关条件的约束下扩展到目标节点,从而找到问题的解. 子集树 当所给的问题是从n个元素组成的集合 ...

最新文章

  1. python 保存内容到记事本里面
  2. WPF ,listbox,平滑滚动的2种方式。
  3. hdu 4857 Little Devil I
  4. 解决IE正常模式与兼容性模式的办法
  5. mysql命令行执行外部文件
  6. (转)什么时候加上android.intent.category.DEFAULT和LAUNCHER
  7. ROS的学习(十一)ROS的msg和srv
  8. css3渐变画斜线 demo
  9. 干货 | 利用SPSS进行高级统计分析第四期
  10. MMD布料解算【新手小白】
  11. curve BLS12-377/381 BN256 SageMath脚本
  12. 学大数据专业未来应该怎么就业?有什么岗位?
  13. 用遗传算法解决VRP问题
  14. 一对一、一对多、多对多(实操)
  15. 互联网赚钱:死磕和专注
  16. 数据结构:渐进记法详解
  17. 虚漠鸿蒙什么意思,好!妙哉妙哉!张济所作之诗不仅符合题意,更是言出了万物伊始乃...
  18. Tomcat7源码解析
  19. 网络工作室官网HTML源码
  20. 将火狐浏览器鼠标滚轮滚动速度调到接近edge浏览器的效果

热门文章

  1. 计算机上无法共享文件夹,高手支招,能访问电脑,但不能访问其中得共享文件夹?...
  2. 实时查询引擎 - Apache Drill 介绍与应用
  3. 计算机在工业工程中的应用,信息技术在工业工程中的应用现状
  4. 解决idel运行run变为灰色,无maven问题
  5. Markdown之改变 字体、字号与颜色
  6. 安装Tensorflow1.14(cpu)+Kera2.2.5指南
  7. 溯源技术基因,洞悉新华三的成长秘诀
  8. Python中使用item()方法遍历字典的例子
  9. ajax传递knockout对象的值
  10. 趣味数学——线性变换可视化交互系统