Bron–Kerbosch算法-最大独立集与最大团
Bron-Kerbosch 算法计算图的最大全连通分量(团clique)
最大独立集: 顶点集V中取 K个顶点,其两两间无连接。
最大团: 顶点集V中取 K个顶点,其两两间有边连接。
最大团中顶点数量 = 补图的最大独立集中顶点数量
2. 剪枝2:自己开始从前往后的枚举顶点, TLE两次. 后来从后往前枚举顶点,发现可以利用顶点之间的承袭性.我用num[i] 记录的可选顶点集合为 V[i, i+1, ... , n] 中的最大团数目, 目标是求num[1].
分析易知, num[i] = num[i+1] 或者 num[i]+1 (num[1...n] 具有非降的单调性,从后往前求)
由这个式子以及num[]信息的记录,使得我们可以增加两处剪枝:
3.上/下剪枝:假设当前枚举的是顶点x, 它的第一个邻接顶是i (标号一定比x大,即num[i]已经求出) 我们可以知道, 若 1 + num[i] <= best, 那么是没没要往下枚举这个顶点x了,因为包含它的团是不可能超过我们目前的最优值的。
4. 立即返回剪枝: 由于num[i]最大可能为num[i+1]+1, 所以在枚举顶点i时,只要一更新best,可知此时的num[i]就为num[i+1]+1了,不需要再去尝试找其他的方案了,所以应立即返回.
#include<cstdio>
#include<cstdlib>
#include<cstring>int best;
int num[maxn];
// int x[maxn];
int path[maxn];
int g[maxn][maxn], n;bool dfs( int *adj, int total, int cnt ){ // total: 与u相连的顶点数量 , cnt表示当前团的数量 int i, j, k;int t[maxn];if( total == 0 ){ // 当此团中最后一个点 没有 比起序号大 的顶点相连时 if( best < cnt ){ // 问题1:best为最大团中顶点的数量 // for( i = 0; i < cnt; i++) path[i] = x[i];best = cnt; return true; } return false;} for( i = 0; i < totl; i++){ // 枚举每一个与 u 相连的顶点 adj[i] if( cnt+(total-i) <= best ) return false; // 剪枝1, 若当前 顶点数量cnt 加上还能够增加的最大数量 仍小于 best则 退出并返回false if( cnt+num[adj[i]] <= best ) return false; // 剪枝2, 若当前 顶点数量cnt 加上 包含adj[i]的最大团顶点数 仍小于 best则 退出并返回false // x[cnt] = adj[i];for( k = 0, j = i+1, j < total; j++ ) // 扫描 与u相连的顶点 中与 adj[u]相连的顶点 并存储到 数组 t[]中,数量为k if( g[ adj[i] ][ adj[j] ] )t[ k++ ] = adj[j];if( dfs( t, k, cnt+1 ) ) return true;} return false;
}
int MaximumClique(){int i, j, k;int adj[maxn];if( n <= 0 ) return 0;best = 0;for( i = n-1; i >= 0; i-- ){// x[0] = i; for( k = 0, j = i+1, j < n; j++ ) // 遍历 [i+1, n] 间顶点, if( g[i][j] ) adj[k++] = j;dfs( adj, k, 1 ); // *adj, total, cntnum[i] = best; // 得出顶点 i, 出发构成最大团 中顶点数量 } return best;
}
#include<cstdio>
#include<cstring>
#define N 1010
bool flag[N], a[N][N];
int ans, cnt[N], group[N], n, vis[N];
// 最大团: V中取K个顶点,两点间相互连接
// 最大独立集: V中取K个顶点,两点间不连接
// 最大团数量 = 补图中最大独立集数bool dfs( int u, int pos ){int i, j;for( i = u+1; i <= n; i++){if( cnt[i]+pos <= ans ) return 0;if( a[u][i] ){// 与目前团中元素比较,取 Non-N(i) for( j = 0; j < pos; j++ ) if( !a[i][ vis[j] ] ) break; if( j == pos ){ // 若为空,则皆与 i 相邻,则此时将i加入到 最大团中 vis[pos] = i;if( dfs( i, pos+1 ) ) return 1; } }} if( pos > ans ){for( i = 0; i < pos; i++ )group[i] = vis[i]; // 最大团 元素 ans = pos;return 1; } return 0;
}
void maxclique()
{ans=-1;for(int i=n;i>0;i--){vis[0]=i;dfs(i,1);cnt[i]=ans;}
}
Bron–Kerbosch算法-最大独立集与最大团相关推荐
- Bron–Kerbosch算法求一般图最大团/最大独立集
最大团: V中取K个顶点,两点间相互连接 最大独立集: V中取K个顶点,两点间不连接 最大团数量 = 补图中最大独立集数 关于 Bron-Kerbosch算法(原文) 基础形式是一个递归回溯 ...
- 无向图的最大独立集和最大团
首先说说最大独立集和最大团的意义: 最大独立集:从无向图中的顶点中选出k个并且k个顶点之间互不相邻,最大的k就是最大独立集 最大团:从无向图的顶点集中选出k个并且k个顶点之间任意两点之间都相邻(完全图 ...
- 求图中的最大独立集或最大团(UVA 193)
几个概念 完全图:简单无向图,图中的任意两个点之间有且仅有一条边相连,所有完全图都是它本身的团. 补图:图G的补图通俗的来讲就是完全图Kn去除G的边集后得到的图Kn-G. 团(clique):顶点集C ...
- 二分图的最小顶点覆盖 和 最大独立集 和 最大团
最小顶点覆盖 概念: 如果称选了一个点的话, 就覆盖了所有与这点相连的边. 现在要选出最小的点, 来覆盖二分图中所有边. 结论: 最小顶点覆盖 = 二分图最大匹配. 证明: Click 最大独立集 概 ...
- 终于等到你,Alibaba首发:大师级算法宝典,足以团灭LeetCode
前言: 说到算法,相信每一个程序员和接触过程序员的朋友都不会陌生,直到现在算法一直占着面试必问的地位,而算法面试也仍是当前最适合公司筛选程序员的方法之一,在阿里,字节跳动.华为等公司带动下,无论是求职 ...
- 骑士放置 (匈牙利算法 最大独立集)
描述 给定一个 N*M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照"日& ...
- 天天写算法之(最大团)Maximum Clique
地址:点击打开链接 这个题目,emmm,以前没有接触过,最大完全子图(最大团),去网上看了一波,很简单.代码如下, #include<iostream> #include<cstdi ...
- CRF算法中辅助概念 团 极大团 最大团
https://blog.csdn.net/aspirinvagrant/article/details/40735609
- HDU1530(最大团问题)
1定义: 其中,形式参数t表示第t个顶点,Place(t)用来判断第t个顶点能否放入团里.二维数组a[][]是图的邻接矩阵.一维数组x[]记录当前解.搜索到第t层时,从第1 个顶点用第t-1个顶点的状 ...
最新文章
- 基于感知损失的实时风格迁移与超分辨率重建
- sql语句技巧,不敢独享,特此呈上
- C#:异步编程和线程的使用(.NET 4.5 ),异步方法改为同步执行
- 谈谈在.NET Core中使用Redis和Memcached的序列化问题
- win10资源管理器怎么打开_让你效率倍增的电脑神器,最强资源管理器增强工具「QTTabBar」...
- nlp3-有限自动机FLandFA
- 操作系统--内核级线程实现
- 内置模块/核心模块 (自带的) --fs 文件系统
- 0.3 preface
- 现金支票打印模板excel_WPS里面如何批量打印(WPS2019)
- 为什么计算机要学电路与电子技术,电路与电子技术基础(计算机科学与技术面向新工科专业建设计算机系列教材)...
- java web背景颜色表,更改表行背景颜色
- C++标准委员会7月科隆会议中投票通过的特性
- matlab 去高光,Specular-Highlight-Mitigation-Removal-master
- Action层, Service层 ,modle层 和 Dao层详解
- Jmockit使用笔记_基本功能使用@Tested_@Injectable_@Mocked_Expectations
- 云大使推广的返利规则是什么
- 软件测试内容全貌——全景图 (1)
- 私域流量社群公司团队管理KPI考核运营方案制度
- python3 的 md5加密
热门文章
- 从Excel认识Power Pivot
- 高性能JavaScript模板引擎template.js原理解析
- showdoc mysql_showdoc
- npm install是什么意思
- MAC抓包工具Charles
- Parallels Desktop Business Edition 13.2.0虚拟机破解版
- 服务器虚拟内存 关闭,关机 清除 Windows 10 (虚拟内存) - Windows security | Microsoft Docs...
- ORB_SLAM2中特征提取之图像金字塔尺度不变性理解
- 英伟达发布Game Ready新驱动,支持多款新游戏
- 树莓派:获取传感器数据