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

news2025/1/19 8:28:13

文章目录

    • @[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到已选入的顶点集中每个顶点都有边相连,在进入右子树前,必须确认还有足够多的可选择顶点,使得算法有可能在右子树中找到更大的团

时间复杂性

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

Python实现

def find_maximum_clique(graph):
    n = len(graph)
    vertices = list(range(n))
    max_clique = []

    def is_clique(graph, vertices):
        # 约束函数: 判断给定的顶点集合是否构成一个团(完全子图)
        for i in range(len(vertices)):
            for j in range(i + 1, len(vertices)):
                if not graph[vertices[i]][vertices[j]]:
                    return False

        return True

    def bound(current_clique, neighbors):
        # 限界函数
        return len(current_clique) + len(neighbors)

    def backtrack(graph, vertices, current_clique, max_clique):
        if not vertices:
            if len(current_clique) > len(max_clique):
                max_clique.clear()
                max_clique.extend(current_clique)

            return

        vertex = vertices.pop(0)
        current_clique.append(vertex)

        neighbors = []
        for v in vertices:
            if graph[vertex][v]:
                neighbors.append(v)

        # 选择当前顶点并加入团
        if is_clique(graph, current_clique):
            backtrack(graph, neighbors, current_clique, max_clique)

        # 不选择当前顶点
        if bound(current_clique, neighbors) > len(max_clique):
            backtrack(graph, neighbors, current_clique[:-1], max_clique)

        vertices.insert(0, vertex)
        current_clique.pop()

    backtrack(graph, vertices, [], max_clique)

    return max_clique


graph = [
    [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]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fork函数详解【Linux】

fork函数详解【Linux】 fork函数的概念fork调用后的底层细节解释fork学习中的一些笔记和问题fork的写实拷贝深拷贝的策略 fork调用失败的原因 fork函数的概念 调用fork函数可以在已存在的进程中创建一个子进程,此时,新进程叫做子进程,原进程叫…

100000000!文心一言披露最新用户规模

“文心一言用户规模突破1亿。” 12月28日,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上,王海峰以《文心加飞桨,翩然赴星河》为题作了主旨演讲,分享了飞桨和文…

【tcp】TCP CLOSE_WAIT问题分析与定位

一、问题背景 某日,运维突然在群里突然丢出告警信息: 对象类型:主机 检测规则:NET.TCP.CLOSE.WAIT 告警内容:CLOSE_WAIT状态的TCP连接数大于500 ....image.png 上面告警信息已经说的很明白,CLOSE_WAIT状…

【UE在关卡序列制作图片序列,捕获影片时出现小白人下落的场景或者空场景】

UE在关卡序列制作图片序列,捕获影片时出现小白人下落的场景或者空场景 问题 下面是有问题的截图 1.如果场景没有放角色就是纯天空 2.如果有角色就是角色一直在下落 原因 使用影片场景捕获(旧版时),如果镜头帧率的长度没有和影片的长度一致…

操作教程|MeterSphere UI测试+VNC:简单、快捷地查看UI测试实时执行详情

编者注:本文为CSDN博主hxe116的原创文章。 原文链接为:https://blog.csdn.net/hxe116/article/details/134714960?spm1001.2014.3001.5502 作为一款一站式的开源持续测试平台,MeterSphere涵盖了测试跟踪、接口测试、UI测试和性能测试等功能…

YOLO格式转VOC格式

#仅支持图片格式统一的,多格式图片需要完善 from xml.dom.minidom import Document import os import cv2 from PIL import Image import numpy as np def makexml

【MAX30102 T03】心率血氧传感器

目录 一、实物图 二、原理图 引脚定义 三、简介 选择模式 I2C 通讯格式: UART 通讯格式: 四、结构尺寸 五、注意: 作者:特纳斯电子 请以底部官方认证的推广方式联系作者 一、实物图 二、原理图 引脚定义 三、简介 血氧心率测量模…

Matplotlib的详细使用及原理

认识matplotlib Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。 Matplotlib已经成为python中公认的数据可视化工具,我们所熟…

巨匠纺・品鉴窗帘是一线品牌吗,产品质量怎么样

巨匠纺・品鉴窗帘是一线品牌,产品品质有保障,作为深耕行业多年的窗帘品牌,巨匠纺・品鉴窗帘凭借不断升级的匠心品质、过硬的综合实力和品牌影响力在众多窗帘中脱颖而出,公司先后荣获中国 3.15 诚信品牌、中国绿色环保品牌、中国窗…

【学习笔记】GAN生成对抗神经网络原理与实践

最早在2014年Ian J. Goodfellow等人提出的GAN。 文献为:Generative Adversarial Nets GAN面临的主要挑战有模型训练困难,容易出现生成模型坍塌等问题。因为GAN是采用生成对抗策略来训练的,优化生成模型必然导致判别模型的损失增大。 定义 生…

旧衣回收小程序搭建,稳占回收市场

近几年我国大众的消费水平不断提升,闲置物品也相应增加了不少,尤其是闲置衣服,为了减少资源浪费,旧衣服回收回收行业受到了大众的关注。 目前我国旧衣服回收行业的市场规模达到了300多亿元,旧衣回收行业的商业价值非常…

机器学习之人工神经网络(Artificial Neural Networks,ANN)

人工神经网络(Artificial Neural Networks,ANN)是机器学习中的一种模型,灵感来源于人脑的神经网络结构。它由神经元(或称为节点)构成的层级结构组成,每个神经元接收输入并生成输出,这些输入和输出通过权重进行连接。 人工神经网络(ANN)是一种模仿生物神经系统构建的…

算法基础之整数划分

整数划分 核心思想: 计数类dp 背包做法 f[i][j] 表示 取 1 – i 的物品 总容量为j的选法数量 f[i][j] f[i-1][j] f[i-1][j-v[i]] f[i-1][j-2v[i]] f[i-1][j-3v[i]] ……f[i-1][j-kv[i]] f[i][j-v[i]] f[i-1][j-v[i]] f[i-1][j-2v[i]] f[i-1][j-3v[i]] ……f[i…

十分钟安装Tensorflow-gpu2.6.0+本机CUDA12 以及numpy+matplotlib各包版本协调问题

换了台机器,又装Tensorflow,记得我第一次装的时候装了好几天,而今天只用了十分钟就搞定了,因为这个方法只用在终端操作,不用去英伟达官网下载包,刷刷刷的贼快,只是后面去找版本的对应问题了又花…

模拟算法 蓝桥杯备赛系列 acwing

文章目录: 基础知识 什么是模拟? 例题 一、错误票据 1.解题思路 2.代码 二、移动距离 1.解题思路 2.代码 三、航班时间 1.解题思路 2.代码 四、外卖优先级 1.解题思路 2.代码 前面为了目录好看大家就当个玩笑看吧哈哈哈。下面上正文。 正文 基础知识 什…

码住!8个小众宝藏的开发者学习类网站

1、simplilearn simplilearn是全球排名第一的在线学习网站,它的课程由世界知名大学、顶级企业和领先的行业机构通过实时在线课程设计和提供,其中包括顶级行业从业者、广受欢迎的培训师和全球领导者。 2、VisuAlgo VisuAlgo是一个免费的在线学习算法和数…

Nginx直播服务器搭建及推拉流测试

文章目录 前言一、搭建 Nginx 直播服务器1、安装 Nginx 依赖2、下载并解压源码①、下载并解压 nginx-http-flv-module 直播模块源码②、下载并解压 Nginx 源码 3、编译安装4、配置 rtmp 服务①、添加 rtmp 服务②、验证配置 二、推流、拉流测试1、ffmepg 推流2、VLC 拉流 前言 …

【汇编笔记】初识汇编-内存读写

汇编语言的由来: CPU是计算机的核心,由于计算机只认识二进制,所以CPU执行的指令是二进制。 我们要想让CPU工作,就得给他提供它认识的指令,这一系列的指令的集合,称之为指令集。 指令集: 不同的体…

PyTorch深度学习实战(28)——对抗攻击(Adversarial Attack)

PyTorch深度学习实战(28)——对抗攻击 0. 前言1. 对抗攻击2. 对抗攻击模型分析3. 使用 PyTorch 实现对抗攻击小结系列链接 0. 前言 近年来,深度学习在图像分类、目标检测、图像分割等诸多领域取得了突破性进展,深度学习模型已经能…

React学习计划-React16--React基础(七)redux使用与介绍

笔记gitee地址 一、redux是什么 redux是一个专门用于做状态管理的js库(不是react插件库)它可以用在react、angular、vue的项目中,但基本与react配合使用作用:集中式管理react应用中多个组件共享的状态 二、什么情况下需要使用r…