1. 知识点

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

装载问题—回溯法-子集树

1.1 完全子图

简单说就是,在完全子图中,所有顶点都存在一条边,相互连接。 例如上图中的,{1,2},{1,2,5};这样的图就是完全子图

1.2 团&&最大团

一个完全子图是团 的充分必要条件是,该完全子图不包含在更大的完全子图中。例如,{1,2}虽然是完全子图,但是{1,2}包含在完全子图{1,2,5}中,所以{1,2}不是团,但{1,2,5}不包含在更大的完全子图中,所以{1,2,5}是团。

最大团就是所含节点数最多的团。例如:上图中,最大团有:{1,2,5},{2,3,5},{1,4,5};

1.3 补图

上图中的(a)和(b)互为补图。A和B互为补图就是,A和B中顶点个数是一样的,A和B中的边不同,但A和B中的边合并之后,得到一个图C,其中,C中的任意两个顶点之间都有一条连边(n阶完全图)。

1.4空子图

例如:上图中,{2,4}是(a)图的空子图,顶点2,4都属于a图,但是a图中不存在2-4之间的连边。那2-4之间的连边存在哪里呢?a图的补图。

也就是空子图中的点之间都没有连边。

1.5 独立集&&最大独立集

独立集,从字面意思理解:独立点的集合。什么是独立点呢?就是和图中其它的点都没有连边。这个定义和 空子图 相联系。

正规定义就是:G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。

最大独立集,就是所含顶点最多的独立集。

例如:{2,4}是(a)图的空子图,也是(a)的独立集;

{1,2,5}是(b)图的空子图。

联合 完全子图,补图 和 空子图的概念我们可以得到:

  1. 如果U是G的完全子图,那么U是(G的补图)的空子图。
  2. U是G的团,那么U是(G的补图)的独立集。
  3. U是G的最大团,当且仅当U是(G的补图)的最大独立集。

引入代码分析

#include<cstdio>
using namespace std;
const int num=110;
int n,m,cn,rn,bn;//n,无向图顶点数;m,无向图的边数;cn,当前 完全子图中 选择了cn个节点;rn,剩余的节点数;bn,目前找到的团,中所含的最多节点;
int e[num][num];//e[i][j]=1,表示i和j之间有一条无向边。
int x[num],bx[num];//x[i],x[i]=1;表示第i个节点已加入当前完全子图;bx[]对应bn中记录的团所包含的点;bx[i]=1;表示有该节点;
void BackTrack(int i)
{//处理完n个节点之后,去更新最优解if(i>n){if(cn>bn){//保存最优解;for(int i=1;i<=n;i++) bx[i]=x[i];bn=cn;}return ;}rn=n-i;//rn=n-i,即为 当前节点之后  还剩余的节点。(i,n]的节点数。//选择该点:cn:[1:i)  , rn:(i,n]的点; //if cn + 1 + rn > bn 的话, 就有可能更新最优解;if(cn+1+rn>bn){int f=1;//判断第i个节点和当前完全子图中的节点,x[k]==1;是否都连接;for(int k=1;k<=n;k++) {if(x[k]&&e[i][k]==0){f=0;break;}}//i和完全子图中的点都连接;if(f){//子图中点的数目+1;标记cn++;x[i]=1;BackTrack(i+1);//取消x[i]=0;cn--;}}//cn:  [1:i) ; rn: (i:n];//不选该点;if(cn+rn>bn){x[i]=0;BackTrack(i+1);}}
int main()
{//输入无向图的数据scanf("%d%d",&n,&m);//第i个点和第i个是相联系的。for(int i=1;i<=n;i++) e[i][i]=1;int u,v;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);e[u][v]=e[v][u]=1;} BackTrack(1);//输出方案printf("Bn:%dn",bn);for(int i=1;i<=n;i++) if(bx[i]) printf("%d ",i);return 0;
}
/*
样例:
5 7
1 2
2 3
3 5
4 5
1 4
1 5
2 5
*/

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

  1. 在python语言中用=判断两个数值是否相等_在Python语言中,要判断两个值是否不等,应使用下列哪个运算符?...

    阅读以下说明,回答问题1至问题3,将答案填入答题纸对应栏内.[说明]在某嵌入式处理器上,编写以下两段秸序(编译选项中,存储采用4字节对齐方式).程序段1:struct studentl {char n ...

  2. C语言字符串判断是否与已知相同,C语言中判断两个字符串是否相同的方法

    C语言中判断两个字符串是否相同的方法 C语言提供了几个标准库函数,可以比较两个字符串是否相同.以下是用strcmp()函数比较字符串的一个例子: #include #include void main ...

  3. python判断字符串相等_如何在python语言中判断两个变量或字符串相等

    在python语言中,判断两个变量是否相等或一致,除了使用==之外,还是可以使用is来判断.is和==作用是一致的,但是还有个判断不一致,就是使用is not.下面利用几个实例说明==和is的区别,操 ...

  4. C语言判断两字符串同构,c语言实现判断两颗树是否同构

    在本题中认为如果两个树左右子树交换可以相同,也被认为是同构树. 对应输入格式为:4(总结点数) A - 1 B 2 3 C - - D - - #include #define Tree int #d ...

  5. c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...

    如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...

  6. java判断两个矩形是否相交_判断矩形相交以及求出相交的区域

    问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2). (1)设计一个算法,确定两 ...

  7. python判断两个数是否互质_《算法》第一章——判断两个整数是否互质

    判断两个整数互质的方法 概念:公约数只有1的两个数叫做互质数.根据互质数的概念可以对一组数是否互质进行判断.如:9和11的公约数只有1,则它们是互质数. 求商判断法:用大数除以小数,如果除得的余数与其 ...

  8. 信息学奥赛C++语言:判断两位数

    [题目描述] 从键盘输入一个数,如果是两位数那么输出yes,否则输出no. [输入] 输入一行,包含1 个整数 [输出] 输出只有一行,yes 或 no. [输入样例] Sample Input1 2 ...

  9. 求两数是否互质c语言程序,判断两个数a,b是否为互质数的程序,用C语言编写?...

    优质回答 回答者:福尔摩猪 两个数互质,就是说两个数的没有公共因子,即最大公约数是1 程序如下: #include int GCD(int x,int y)//最大公约数函数,欧几里德算法 { int ...

最新文章

  1. 重设wordpress用户密码
  2. 洛谷 - P2045 - 方格取数加强版 - 费用流
  3. 缓存方式之cookie的使用
  4. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试
  5. 不唐突的JavaScript的七条准则
  6. IOS UIView 对象详解
  7. PPTP与Open×××区别
  8. 使用FragmentTabHost出现的错误!
  9. mysql-使用存储过程一次性批量创建多张表
  10. 计算机重做系统 d盘,重装系统后c盘变成d盘怎么办|pe装系统c盘变d盘解决方法
  11. 产品可靠性测试 - 学习笔记(1)
  12. awgn信道c语言程序,关于awgn信道的程序求解~!
  13. 生物素PEG叠氮,Biotin-PEG-Azide,N3-PEG-Biotin
  14. React + TS项目开发小技巧总结
  15. EXCEL转PDF最便捷的方法
  16. 【BZOJ2002】【HNOI2010】弹飞绵羊(LCT)
  17. hbase数据库的一些基本操作(持续更新中)
  18. 暑假积分不等式初探(未完)
  19. Mint UI—loadmore—Pull down下拉刷新将下拉刷新的箭头标志更换成其他图片(图文)
  20. ESP32超详细学习记录:NTP同步时间

热门文章

  1. 微信WeixinJSBridge API 屏蔽右上角分享等常用方法
  2. ubuntu下面如何切换virtual_box的鼠标
  3. Godaddy 上的域名服务器状态查询
  4. 树形数据深度排序处理示例(模拟单编号法).sql
  5. 1-算法-hanoi汉诺塔问题- 递归
  6. 乐高创意机器人moc_LEGO乐高MOC作品欣赏:超有爱机器人偶E-MOTE
  7. 微课|中学生可以这样学Python(3.2节):双分支选择结构
  8. mysql教程丿it教程网_1.0MySQL基础入门【DQL部分】
  9. python split 引号_Python 学习笔记 - 字符串
  10. python如何互换_python中怎么交换列的顺序