分支限界——最大团问题

简介: 分支限界——最大团问题

给定有一个无向图,找出最大团个数。

最大团也就是该图中最大的完全图(各顶点之间都有边)。

image.png

算法思想:设p为所有点集的集合,依次取出p中的顶点作为团的起始点,也就是以该点为起点开始拓展,每次查看相邻顶点是否与团内各点联通,若true,则加入该点。

为了进一步降低时间复杂度,采取记忆化递归的方式,从后向前遍历顶点,用cnt数组记录该点以后所成最大团的个数,以此知该点的潜力,达到剪枝的效果。

#include<bits/stdc++.h>
using namespace std;
#define maxm 55
int g[maxm][maxm];//存图
int vis[maxm];//存放已选择的点
int cnt[maxm];//cnt[i]表示用编号>=i的点能组成的最大团的点数
int ans, n;
bool dfs(int cur, int num) {//从第cur个点开始向后添加,当前点是第num个
  for (int i = cur + 1; i <= n; i++) {
    if (cnt[i] + num <= ans)//当前点后的所有点组成的最大团的最大点数+已经加入的点数<=当前最佳答案(最好的情况都不可能超过当前最优解,则进行剪枝)
      return 0;
    if (g[cur][i])//两点相邻
    {
      int ok = 1;
      for (int j = 0; j < num; j++)//是否和当前已经加入团的所有点相邻
        if (!g[i][vis[j]])
        {
          ok = 0;
          break;
        }
      if (ok) {//当前点可以加入团中
        vis[num] = i;
        if (dfs(i, num + 1))//第一次dfs成功的一定是最大的
          return 1;
      }
    }
  }
  ans = max(ans, num);
  return (ans == max(num, ans) ? 0 : 1);
}
void maxclique() {
  for (int i = n; i > 0; i--)
  {
    vis[0] = i;
    dfs(i, 1);
    cnt[i] = ans;
  }
}
int main()
{
  cin >> n;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      cin >> g[i][j];
      g[j][i] = g[i][j];
    }
  maxclique();
  cout << cnt[1];
  return 0;
}
/*
5
1 1 0 1 1
1 1 1 0 1
0 1 1 0 1 
1 0 0 1 1
1 1 1 1 1
*/
相关文章
|
5月前
|
前端开发 开发者 容器
|
5月前
|
算法 调度
详解操作系统四大常用的作业调度算法(FCFS丨SJF丨HRRN丨RR)
详解操作系统四大常用的作业调度算法(FCFS丨SJF丨HRRN丨RR)
3170 0
|
域名解析 弹性计算 运维
【运维】阿里云宝塔面板域名DNS解析(如何配置用域名访问网站)
【运维】阿里云宝塔面板域名DNS解析(如何配置用域名访问网站)
3163 0
【运维】阿里云宝塔面板域名DNS解析(如何配置用域名访问网站)
|
前端开发 easyexcel Java
Java+EasyExcel实现文件导入导出,导入导出如此简单
项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在Java中导入Excel文件与导出Excel文件
10929 2
Java+EasyExcel实现文件导入导出,导入导出如此简单
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
187654 0
|
存储 算法 C++
虚拟存储管理(OPT,FIFO,LRU,LFU,NUR算法的C++实现)
虚拟存储管理(OPT,FIFO,LRU,LFU,NUR算法的C++实现)
428 1
|
12月前
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
8010 1
|
算法
最短路径之基于贪心算法的迪杰斯特拉dijkstra算法(有图解,含码源)
最短路径之基于贪心算法的迪杰斯特拉dijkstra算法(有图解,含码源)
383 0
|
移动开发 前端开发 JavaScript
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
13497 3
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
|
Kubernetes 网络协议 Linux
docker镜像仓库hub.docker.com无法访问-解决办法
docker镜像仓库hub.docker.com无法访问-解决办法1 个人镜像站点2 dockerhub为什么无法访问2.1 查看dockerhub实际IP2.2 ping检测3 镜像加速3.1 使用国内镜像加速3.1.1 docker配置:3.1.2 containerd配置:3.2 使用博主个人镜像仓库3.2.1 目前有如下镜像仓库,后续会陆续增加3.2.2 使用方式3.2.3 拉取镜像
4679 3
docker镜像仓库hub.docker.com无法访问-解决办法