【回溯算法】【Python实现】最大团问题

文章目录

    • @[toc]
      • 问题描述
      • 回溯算法
      • `Python`实现
      • 时间复杂性

问题描述

  • 给定无向图 G = ( V , E ) G = (V , E) G=(V,E),如果 U ⊆ V U \subseteq V UV,且对任意 u u u v ∈ U v \in U vU ( u , v ) ∈ E (u , v) \in E (u,v)E,则称 U U U G G G的完全子图

  • G G G的完全子图 U U U G G G的一个团当且仅当 U U U不包含在 G G G的更大的完全子图中, G G G的最大团是指 G G G中所含顶点数最多的团

  • 如果 U ⊆ V U \subseteq V UV且对任意 u u u v ∈ U v \in U vU,有 ( u , v ) ∉ E (u , v) \notin E (u,v)/E,则称 U U U G G G的空子图

  • G G G的空子图 U U U G G G的独立集当且仅当 U U U不包含在 G G G的更大的空子图中, G G G的最大独立集是 G G G中所含顶点数最多的独立集

  • 对于任意无向图 G = ( V , E ) G = (V , E) G=(V,E),其补图 G ˉ = ( V ′ , E ′ ) \bar{G} = (V^{'} , E^{'}) Gˉ=(V,E)定义为: V ′ = V V^{'} = V V=V E ′ = { ( u , v ) ∣ ( u , v ) ∉ E } E^{'} = \set{(u , v) \mid (u , v) \notin E} E={(u,v)(u,v)/E}

  • 如果 U U U G G G的完全子图,则它是 G ˉ \bar{G} Gˉ的空子图,反之亦然,因此, G G G的团与 G ˉ \bar{G} Gˉ的独立集之间存在一一对应关系,特别地, U U U G G G的最大团,当且仅当 U U U G ˉ \bar{G} Gˉ的最大独立集

  • 无向图 G G G G G G的补图 G ˉ \bar{G} Gˉ如下图所示

1


回溯算法

  • G G G的最大团和最大独立集问题都可以看作图 G G G的顶点集 V V V的子集选取问题,因此,可用子集树表示问题的解空间,解最大团问题的回溯法与解装载问题的回溯法十分相似
  • 设当前扩展结点 Z Z Z位于解空间树的第 i i i层,在进入左子树前,必须确认从顶点 i i i到已选入的顶点集中每个顶点都有边相连,在进入右子树前,必须确认还有足够多的可选择顶点,使得算法有可能在右子树中找到更大的团

Python实现

def find_maximum_clique(graph):n = len(graph)vertices = list(range(n))max_clique = []def is_clique(current_clique):# 约束函数: 判断给定的顶点集合是否构成一个团(完全子图)for i in range(len(current_clique)):for j in range(i + 1, len(current_clique)):if not graph[current_clique[i]][current_clique[j]]:return Falsereturn Truedef bound(current_clique, vertices):# 限界函数return len(current_clique) + len(vertices)def backtrack(vertices, current_clique):nonlocal max_cliqueif not vertices:if len(current_clique) > len(max_clique):max_clique.clear()max_clique.extend(current_clique)returnvertex = vertices.pop(0)current_clique.append(vertex)neighbors = []for v in vertices:if graph[vertex][v]:neighbors.append(v)# 选择当前顶点并加入团if is_clique(current_clique):backtrack(neighbors, current_clique)# 恢复回溯前状态current_clique.pop()# 不选择当前顶点if bound(current_clique, vertices) > len(max_clique):backtrack(vertices, current_clique)backtrack(vertices, [])return max_cliquegraph = [[0, 1, 0, 1, 1],[1, 0, 1, 0, 1],[0, 1, 0, 0, 1],[1, 0, 0, 0, 1],[1, 1, 1, 1, 0]
]maximum_clique = find_maximum_clique(graph)print(f'最大团: {maximum_clique}')
最大团: [0, 1, 4]

时间复杂性

  • 解最大团问题的回溯算法所需的计算时间为 O ( n 2 n ) O(n 2^{n}) O(n2n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/324710.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat导出表结构到Excel或Word

文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…

13.Netty组件EventLoopGroup和EventLoop介绍

EventLoop 是一个单线程的执行器(同时维护了一个Selector),里面有run方法处理Channel上源源不断的io事件。 1.继承java.util.concurrent.ScheduledExecutorService因此包含了线程池中所有的方法。 2.继承netty自己的OrderedEventExecutor …

JDBC调用MogDB存储过程返回ref_cursor的方法和注意事项

MogDB在处理存储过程的时候,有时候需要返回结果集,类型为ref_cursor,但有时候可能会报错。而大部分应用程序都是使用Java JDBC. 根据我们这几年的数据库国产化改造经验,给大家分享一下JDBC调用 MogDB存储过程返回ref_cursor的方法…

算法设计与分析 例题解答 解空间与搜索

1.请画出用回溯法解n3的0-1背包问题的解空间树和当三个物品的重量为{20, 15, 10},价值为{20, 30, 25},背包容量为25时搜索空间树。 答: 解空间树: 搜索空间树: 2. 考虑用分支限界解0-1背包问题 给定n种物品和一背包…

2 GPIO控制

ESP32的GPIO的模式,一共有输入和输出模式两类。其中输入模式:上拉输入、下拉输入、浮空输入、模拟输入;输出模式:输出模式、开漏输出(跟stm32八种输入输出模式有所不同)。库函数中控制引脚的函数如下&#…

行业新应用:电机驱动将成为机器人的动力核心

电机已经遍布当今社会人们生活的方方面面,不仅应用范围越来越广,更新换代的速度也日益加快。按照工作电源分类,可以将它划分为直流电机和交流电机两大类型。直流电机中,按照线圈类型分类,又可以分为有铁芯的电机、空心…

FFmpeg常用API与示例(四)——过滤器实战

1.filter 在多媒体处理中,filter 的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。 语法:[input_link_label1]… filter_nameparameters [output_link_label1]… 1、视…

书生浦语训练营第四次课作业

基础作业 环境配置 拷贝internlm开发机内的环境 studio-conda xtuner0.1.17# 激活环境 conda activate xtuner0.1.17 # 进入家目录 (~的意思是 “当前用户的home路径”) cd ~ # 创建版本文件夹并进入,以跟随本教程 mkdir -p /root/xtuner0…

27.哀家要长脑子了!---栈与队列

1.739. 每日温度 - 力扣(LeetCode) 用单调栈的方法做: 从左到右遍历数组: 栈中存放的是下标,每个温度在原数组中的下标,从大到小排列,因为这样才能确保的是最近一天的升高温度 如果栈为空&am…

优化重启Redis服务脚本

#!/bin/sh echo -e "\033[33m正在关闭redis服务和测试redis进程是否关闭...\033[0m" pkill redis-server sleep 1 #echo -e "\033[33m测试redis进程是否关闭...\033[0m" ps -ef|grep redis-server sleep 1 echo "" echo -e "\033[33m正在…

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5:自然语言处理实践(情感分类) 一:实验目的与要求 1:掌握RNN、LSTM、GRU的原理。 2:学习用RNN、LSTM、GRU网络建立训练模型,并对模型进行评估。 3:学习用RNN、LSTM、GRU网络做…

2010年认证杯SPSSPRO杯数学建模D题(第一阶段)服务网点的分布全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 D题 服务网点的分布 原题再现: 服务网点、通讯基站的设置,都存在如何设置较少的站点,获得较大效益的问题。通讯基站的覆盖范围一般是圆形的,而消防、快餐、快递服务则受到道路情况和到达时间的限…

【前端基础】CSS样式+Vue中绘制时间轴

深度选择器 在 Vue.js 中,/deep/、>>>、:deep 和 ::v-deep 这些都是深度选择器,用于修改子组件的样式。它们主要用于解决作用域样式和组件样式之间的冲突问题。 1. /deep/ 或 >>> /deep/ 和 >>> 是相同的选择器,…

华为机考入门python3--(23)牛客23- 删除字符串中出现次数最少的字符

分类:字符串 知识点: 访问字典中keychar的值,不存在则返回0 my_dict.get(char, 0) 字典的所有值 my_dict.value() 列表中的最小值 min(my_list) 题目来自【牛客】 import sysdef delete_min_freq_char(s):# 计算字母出现的频次…

将来会是Python、Java、Golang三足鼎立吗?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 软件工程里没有银弹&#xff…

word图片水印

一、word中旧水印如何删除 打开word模板,想要删除旧水印,如下图所示操作,但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印,结果显示了2个水印,要怎么删除呢? 如下截图所示,双击打开页…

雷森托尔环保科技有限公司见证2024杭州数字供应链装备展潮流

参展企业介绍 青岛雷森托尔环保科技有限公司创建于2018年,位于山东青岛,现注册资本3000万。公司主营生产模压木托盘、化工木托盘、大型设备木包装、出口木托盘、酒柜木酒架等,公司拥有技术人员6人,均为包装设计专业毕业&#xff0…

Qt | QSpinBox 类 QDoubleSpinBox 类(微调框)

01、QSpinBox 类 1、QSpinBox类是 QAbstractSpinBox 类的直接子类和具体实现, 2、QSpinBox 类被设计用于处理整数和离散值集合,对于浮点值使用 QDoubleSpinBox 类实现。 3、QSpinBox 默认只支持整数值,但可通过其内部的成员函数进行扩展,以支持使用不同的 字符串。 02…

【数组算法】598. 区间加法

给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大整数的个数 。 示例 1: …

深入理解指针(1)

在之前我们学习了许多c语言的基础知识&#xff0c;让我们初步了解了c语言&#xff0c;接下来将来到c语言中一个重点的知识章节--指针&#xff0c;学习完指针后将会让我们对c语言有更深入的理解&#xff0c;接下来就开始指针的讲解 1.内存与地址 1.指针 在了解内存与地址前&am…