最大团

从一个无向图中找出一个点集,使得此集合中任意两个点都有一条直接相连的边

Born_Kerbosch算法:

从后往前枚举每一个点为第一个点,选择的其他点为大于这个点的情况。用vecvecvec记录当前选择的点的集合,判断一个点是否可以选择,只需要枚举已选择的点是否都与之直接相连。

优化: 用numnumnum记录每个点往后的最优情况,如果最优情况加上当前点数量都不能比已有答案ansansans更优,直接returnreturnreturn。

例题:POJ-1492

#include<bits/stdc++.h>
using namespace std;const int maxn=53;
int Mp[maxn][maxn];
int ans_vec[maxn],vec[maxn],num[maxn];//答案团,当前团,每个位置开始遍历得到的最大团int n,ans;
int dfs(int p,int siz){for(int i=p+1;i<=n;i++){if(num[i]+siz<=ans)return 0;if(Mp[p][i]){int can=1;for(int j=1;j<=siz;j++){if(!Mp[vec[j]][i]){can=0;break;}}if(can){vec[siz+1]=i;if(dfs(i,siz+1))return 1;}}}if(siz>ans){ans=siz;for(int i=1;i<=ans;i++)ans_vec[i]=vec[i];return 1;}return 0;
}
int deal(){ans=-1;for(int i=n;i>=1;i--){vec[1]=i;dfs(i,1);num[i]=ans;}return ans;
}
int main(){scanf("%d",&n);while(n){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",Mp[i]+j);}}printf("%d\n",deal());scanf("%d",&n);}
}

最大独立集

以前用二分图匹配求过二分图的最大独立集,那种情况前提是二分图,且更适用于点多边少的情况,而对于点少边多的稠密有环图,需要用Born_Kerbosch算法。

从一个无向图中找出一个点集,使得此集合中任意两个点都没有一条直接相连的边

定理: 一个图的最大独立集等于其补图的最大团

证明: 对于一个图SSS,其最大团集合V1V_1V1​,任意属于V1V_1V1​的两个点都没有边直接相连,则其补图S‾\overline SS中,任意属于V1V_1V1​的两个点皆有边直接相连。

例题:Codeforces-1105E

#include<bits/stdc++.h>
using namespace std;const int maxn=53;
int Mp[maxn][maxn];
int ans_vec[maxn],vec[maxn],num[maxn];//答案团,当前团,每个位置开始遍历得到的最大团int m,n,ans;
bool vis[maxn];
int ct;
map<string,int>id;int dfs(int p,int siz){for(int i=p+1;i<=n;i++){if(num[i]+siz<=ans)return 0;if(!Mp[p][i]){int can=1;for(int j=1;j<=siz;j++){if(Mp[vec[j]][i]){can=0;break;}}if(can){vec[siz+1]=i;if(dfs(i,siz+1))return 1;}}}if(siz>ans){ans=siz;for(int i=1;i<=ans;i++)ans_vec[i]=vec[i];return 1;}return 0;
}
int deal(){ans=-1;for(int i=n;i>=1;i--){vec[1]=i;dfs(i,1);num[i]=ans;}return ans;
}
int main(){string tmp;scanf("%d%d",&m,&n);vector<int>V;for(int i=1;i<=m;i++){int f;scanf("%d",&f);if(f==1){for(int i=0;i<V.size();i++){for(int j=0;j<V.size();j++){if(i==j)continue;Mp[V[i]][V[j]]=1;}}for(int i=0;i<V.size();i++)vis[V[i]]=0;V.clear();}else{cin>>tmp;if(!id.count(tmp))id[tmp]=++ct;int p=id[tmp];if(vis[p])continue;vis[p]=1;V.push_back(p);}}for(int i=0;i<V.size();i++){for(int j=0;j<V.size();j++){if(i==j)continue;Mp[V[i]][V[j]]=1;}}printf("%d\n",deal());
}

间接连接:

如果将两个点的直接连接换成间接连接,那么只需要用floyd求一下传递闭包。

for (int k=0; k<n; k++)            for (int i=0; i<n; i++)                for (int j=0; j<n; j++)                   if (Mp[i][k] && Mp[k][j]) Mp[i][j]=1;

最大团,最大独立集,Born_Kerbosch算法相关推荐

  1. 无向图的最大团/最大独立集 算法总结

    无向图的最大团/最大独立集 算法总结 目录 概述 普通DFS Bron-Kerbosch算法 概述 最大团其实就是最大完全子图的点集,同理极大团也就是极大完全子图的点集,点集内所有的点两两之间都有边相 ...

  2. Bron–Kerbosch算法求一般图最大团/最大独立集

    最大团: V中取K个顶点,两点间相互连接   最大独立集: V中取K个顶点,两点间不连接    最大团数量 = 补图中最大独立集数 关于 Bron-Kerbosch算法(原文) 基础形式是一个递归回溯 ...

  3. 无向图的最大团/最大独立集

    讲解的博客:https://blog.csdn.net/SparkFucker/article/details/83051133 还没写完的代码: #include<iostream> # ...

  4. 378. 骑士放置——最大独立集+匈牙利算法

    给定一个 N×M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照"日&qu ...

  5. 图论 最大团,最大独立集

    经典的NP完全问题,只有暴力解,时间复杂度O(n2^n) 对于无向图来说 所谓最大团, 其实就是找一个最大完全子图,最大就是包含的点最多. 而最大独立集 == 补图的最大团 这里使用深度优先搜索实现, ...

  6. 最大团与最大独立集(递推法+dfs两剪枝求最大团)

    传送门 最大团:从无向图的顶点集中选出k个并且k个顶点之间任意两点之间都相邻(完全图),最大的k就是最大团 最大独立集:从无向图中的顶点中选出k个并且k个顶点之间互不相邻,最大的k就是最大独立集 性质 ...

  7. Bron-Kerbosh算法求解极大团

    Bron-Kerbosh算法求解极大团 参考资料:https://www.jianshu.com/p/437bd6936dad 这篇文章讲得很好,本文的代码也是参照这篇文章,用python实现. 什么 ...

  8. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

    在讲述这两个算法之前,首先有几个概念需要明白: 二分图:  二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...

  9. 图论 —— 最大团问题

    [问题描述] 当 G′ 是图 G 的子图,且 G′ 是关于 V′ 的完全图时,子图 G' 为图 G 的团:当 G' 是团,且不是其他团的子集时,G' 为图 G 的极大团:当 G' 是极大团时,且点数最 ...

最新文章

  1. 网站内容才是SEO的第一要素
  2. [Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)
  3. 大数据学习之Linux环境搭建(导航)
  4. Asterisk权威指南/第三章 安装Asterisk
  5. get请求,参数值为json字符串如何传值
  6. python中property干什么用的?
  7. 高频一线大厂Python面试题:算法+爬虫+数据处理+基础
  8. ZOJ 4028 15th浙江省省赛E. LIS(神奇贪心)
  9. VC2008配置设置(转)
  10. 组装台式计算机配置清单,diy之家 - 2017组装电脑配置清单_电脑diy主机配置推荐...
  11. sp3485调试:sp3485-TTL转max485模块-TTL转usb模块电脑pc
  12. python读取手机通讯录_利用python解析手机通讯录
  13. 微信二维码扫码登录思路
  14. Mysql中从零点到当前时刻的SQL判断
  15. (二)注释(comment)详解
  16. 黑寡妇(BWO)优化算法(Matlab代码实现)
  17. 北京航空航天大学 素数(java)
  18. 机械狗的机器学习入门(绪)——做一盘大菜。2019/3/31
  19. WindowManager
  20. Trying to access array offset on value of type null

热门文章

  1. 百度:P2P网络宣传渠道将重构,审查后将出台“黑白名单”
  2. 【严重】vm2 <3.9.15 沙箱逃逸漏洞(CVE-2023-29017)
  3. 错误现象:(com.logicaldoc.core.security.dao.HibernateUserDAO 102) -- Packet for query
  4. 数字电子技术基础(八):超前进位加法器
  5. 基于SMTP协议和POP3协议实现的邮件收发客户端
  6. Unity | 如何使用webm透明视频
  7. python自动登录校园网_python 脚本自动登陆校园网
  8. POI导出excel+JFreeChart生成图表(柱状图和折线图)
  9. Fedora 12下安装Google Chrome和RealPlayer 11
  10. 三菱Q PLC案例程序,三菱Q系列程序。 QD75MH总线伺服本案例是液晶电视导光板加工