最大团问题--回溯法
一、相关定义
给定一个无向图 ,其中 V 是图的顶点集,E图的边集
完全图:如果无向图中的任何一对顶点之间都有边,这种无向图称为完全图
完全子图:给定无向图 ,如果
,且对应任意
且
,则称U是G的完全子图。(即完全子图中的任意两个顶点之间都有边)
团(最大完全子图):U 是 G 的团当且仅当 U 不包含在G的更大完全子图中。若存在一个最大完全子图包含U,那么 U 不是一个团。
最大团:G 中所包含顶点数最多的团
最大团问题是一个NP-C问题,无法在多项式时间内求出最大团,通常只能在数据规模较小的情况下适用。
二、回溯法
算法思路:通过回溯的方法考虑每个顶点是否加入最大团的情况,因此算法的时间复杂度为 。
首先设最大团为一个空团,往其中加入一个节点,然后依次考虑每个节点,查看该节点是否能够加入团(判断方法:该节点应当与团内每一个节点有一条边),随后向下一节点搜索,直至递归所有节点并回溯结束。
剪枝策略:如果剩下未考虑的节点n加上当前团内的节点数小于此时计算的最大团节点数,则不需要再进行搜索。
对于一个无向图 G={V,E}

可以看出最大团为 { 1 , 2 , 5 } { 1 , 4 , 5 } { 2 , 3 , 5 } 即最大团不唯一。对于一个完全子图{1,2},不是一个团,因为存在包含 {1,2} 的更大的完全子图 {1,2,5} (区分完全子图和团)
下图:左子树时表示考虑节点i加入团中 , 右子树则不在团中
cn为当前团中在节点个数,bestn当前最大团中在节点个数

① 考虑 节点1 时加入当前团时,符合团的条件,则继续深搜考虑节点2,(1,2)之间存在边,符合团的条件,则继续深搜考虑 节点3 ,由于 节点3 与 节点1 之间不存在边,所以 3 不能加入团中,因此不能将 节点3 加入团中,再考虑节点 4 同理(与 节点2 不存在边),继续考虑节点5,符合团在条件,此时不能够继续搜索了,保存当前团 {1,2,5}。
上述过程搜索前,还需判断( cn+n-i>=bestn ),此时可以认为,即使剩下节点都考虑,最大团的节点数还是小于等于当前最大团在节点数。
② 回溯考虑其他情况,当不考虑 节点2 加入团中,往深处搜索,此时(cn+n-i<=bestn),无需再深搜考虑,其他情况同理。
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int maxn=101;
int a[maxn][maxn]; //邻接矩阵
int x[maxn];
int cn,bestn,n,m;
void backtrack(int i)
{if(i>n) // 搜索完所有节点 {bestn=cn;printf("%d\n",bestn);for(int j=1;j<=n;j++){/*if(x[j]==1)printf("%d ",j);*/printf("%d ",x[j]);}printf("\n");return;}int flag=1; // 判断是否与团中节点都相连for(int j=1;j<i;j++){if( x[j] && !a[j][i])//i与j不相连{flag=0;break;}}if(flag==1) //进入左子树{cn++;x[i]=1;backtrack(i+1);cn--;x[i]=0;}if(cn+n-i>bestn) //剪枝{backtrack(i+1);}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){ int u,v;scanf("%d%d",&u,&v);a[u][v]=1;a[v][u]=1;}backtrack(1);return 0;
}相关文章:
最大团问题--回溯法
一、相关定义 给定一个无向图 ,其中 V 是图的顶点集,E图的边集 完全图:如果无向图中的任何一对顶点之间都有边,这种无向图称为完全图 完全子图:给定无向图 ,如果 ,且对应任意 且 ,则…...
MBSE之简单介绍
MBSE之简单介绍 文章目录 MBSE之简单介绍1. What is MBSE?2. MBSE 最佳实践 1. What is MBSE? Model-Based Systems Engineering (MBSE), a.k.a. Model-Based Systems Development (MBSD), is a Systems Engineering process paradigm that emphasizes t…...
基于ODPS解析字段值为JSON的情况
最近在使用ODPS数据库,其中一个字段他是用JSON存储的,但是我是需要JSON字符串中的一个属性值就行,刚好ODPS中有一个函数可以用来使用! 使用案例 select GET_JSON_OBJECT({"id":1,"name":"xiaobai"},$.name);…...
CesiumJS【Basic】- #020 加载glb/gltf文件(Primitive方式)
文章目录 加载glb/gltf文件(Primitive方式)1 目标2 代码实现3 资源文件加载glb/gltf文件(Primitive方式) 1 目标 使用Primitive方式加载glb/gltf文件 2 代码实现 import * as Cesium from "cesium";const viewer = new Cesium.Viewer...
2024黑盾杯复现赛题MISC部分
一、一个logo 一张png图片,查看颜色通道即可发现flag 二、 学会Office 最好用联想自带的excel工具查看,我用WPS打开未解出题目 这里会发现有隐藏信息 隐藏信息为宏加密 。去百度了解宏加密后,发现有俩个宏,一个加密一个解密 执…...
Linux0.12内核源码解读(5)-head.s
大家好,我是呼噜噜,好久没有更新old linux了,本文接着上一篇文章图解CPU的实模式与保护模式,继续向着操作系统内核的世界前进,一起来看看heads.s as86 与GNU as 首先我们得了解一个事实,在Linux0.12内核源…...
刷代码随想录有感(119):动态规划——打家劫舍III(树形dp)
题干: 代码: class Solution { public:vector<int>dp(TreeNode* cur){if(cur NULL)return vector<int>{0, 0};vector<int> left dp(cur -> left);vector<int> right dp(cur -> right);//偷int val1 cur -> val l…...
vivado CARRY_REMAP、CASCADE_HEIGHT
CARRY_REMAP opt_design-carry_remap选项可用于将单个carry*单元重新映射到LUT中 提高了布线的设计效果。使用-carry_remap选项时,仅 将单级进位链转换为LUT。CARRY_REMAP属性允许您 指定在优化过程中要转换的长度较大的进位链。 您可以使用控制任意长度的单个进位链…...
Ubuntu磁盘分区和挂载 虚拟机扩容 逻辑卷的创建和扩容保姆及教程
目录 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 2、Linux的磁盘分区和挂载 3、创建逻辑卷和逻辑卷的扩容 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 通过下图可以看出我们的根磁盘一共有20G的大小,现在我们把它扩容为30G 注:如果你的虚拟机有快照是无…...
【附精彩文章合辑】哈佛辍学小哥的创业经历【挑战英伟达!00 后哈佛辍学小哥研发史上最快 AI 芯片,比 H100 快 20 倍!】
前情提要 https://blog.csdn.net/weixin_42661676/article/details/140020491 哈佛辍学小哥的创业经历 一、背景与起步 这位哈佛辍学小哥,名为Chris Zhu,是一位华裔学生,他在2020年进入哈佛大学,攻读数学学士学位和计算机科学硕…...
Oracle CPU使用率过高问题处理
1.下载Process Explorer 2.打开Process Explorer,查看CPU使用情况最高的进程 3.双击该进程,查看详情 \ 4. 获取cpu使用最好的线程tid 5. 查询sql_id select sql_id from v$session where paddr in( select addr from v$process where spid in(1…...
pyqt的QWidgetList如何多选?如何按下Ctrl多选?
通过设置setSelectionMode(QAbstractItemView.MultiSelection),可以实现QWidgetList的多选。 但是上述结果不太符合我们需求。设置多选模式后,只需鼠标点击就可以选择多个条目。 我希望按下Ctrl键时才进行多选,仅鼠标单击的话,只进…...
【电路笔记】-MOSFET放大器
MOSFET放大器 文章目录 MOSFET放大器1、概述2、电路图3、电气特性3.1 ** I D = F ( V G S ) I_D=F(V_{GS}) ID=F(VGS)**特性3.2 I D = F ( V D S ) I_D=F(V_{DS}) ID=F(VDS)特性4、MOSFET放大器5、输入和输出电压6、电压增益7、总结1、概述 在前面的文章中,我们已经…...
Ubuntu 20.04安装显卡驱动、CUDA、Pytorch(2024.06最新)
文章目录 一、安装显卡驱动1.1 查看显卡型号1.2 根据显卡型号选择驱动1.3 获取下载链接1.4 查看下载的显卡驱动安装文件1.5 更新软件列表和安装必要软件、依赖1.6 卸载原有驱动1.7 禁用默认驱动1.8 安装lightdm显示管理器1.9 停止显示服务器1.10 在文本界面中,禁用X…...
wpf 附加属性 RegisterAttached 内容属性
// // 摘要: // 选中时展示的元素 public static readonly DependencyProperty CheckedElementProperty DependencyProperty.RegisterAttached("CheckedElement", typeof(object), typeof(StatusSwitchElement), new PropertyMetadata((object)null…...
laravel8框架windows下安装运行
目录 1、安装前如果未安装先安装Composer 2、使用composer安装laravel8 3、使用内置服务器:8000 的命令去访问测试 4、使用本地环境运行phpstudy配置到public目录下 Laravel官网 Laravel 中文网 为 Web 工匠创造的 PHP 框架 安装 | 入门指南 |《Laravel 8 中文文档 8.x…...
如何快速判断IP被墙
IP被墙是指IP部分地区或者运营商无法被正常进行访问的一个情况。 被墙的原因有很多种不一一列举,由于被墙的时间短的为按周按月计算,时间长的则为按年计算,所以一般这种情况下只能选择更换IP。 检查办法: 第一,确认IP…...
vitest-前端单元测试
Vitest是一个轻量级、快速且功能强大的测试框架,特别适用于Vite项目,但也可以与其他前端项目(如使用webpack构建的项目)集成使用。Vitest提供极速的测试体验,并包含一系列用于编写和组织测试用例的API,如de…...
Redis 7.x 系列【9】数据类型之自动排重集合(Set)
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SADD2.2 SCARD2.3 SISMEMBER2.4 SREM2.5 SSCAN2.6 SDIFF2.7 SU…...
【LeetCode】每日一题:反转链表
题解思路 循环的方法需要注意prev应该是None开始,然后到结束的时候prev是tail,递归的思路很难绕过弯来,主要在于很难想清楚为什么可以返回尾节点,需要多做递归题,以及递归过程中,可以不使用尾节点来找当前…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
