先看一下最大团问题:



其中,形式参数t表示第t个顶点,Place(t)用来判断第t个顶点能否放入团里。二维数组a[][]是图的邻接矩阵。一维数组x[]记录当前解。搜索到第t层时,从第1 个顶点用第t-1个顶点的状态存放入在x[1:t-1]中;一维数组best记录当前最优解,变量cn,bestcn分别记录当前已包含在团里面的顶点个数和当前最优解包含在团里面的顶点个数,初始化都为0。

最大独立集:一个点数最多的点集,且满足集合内的点互不干扰。
最大独立集=补图中的最大团数

方法一:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxx=1005;
const int inf=0x3f3f3f3f;
int x[maxx];
int ans;
int e[maxx][maxx];
int n,m,G;
int cn;
int best[maxx];
int bestcn;
void init(){cn=0;bestcn=0;ans=0;memset(best,0,sizeof(best));memset(x,0,sizeof(x));memset(e,1,sizeof(e));//注意这里
}
int place(int t){for(int i=1;i<=t-1;i++){if(x[i]&&e[t][i]==0){return 0;}}return 1;
}
void dfs(int t){if(t>n){for(int i=1;i<=n;i++){best[i]=x[i];}bestcn=cn;return ;}if(place(t)){cn++;x[t]=1;dfs(t+1);cn--;}if(cn+n-t>bestcn){x[t]=0;dfs(t+1);}
}
int main(){int count=1;int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);init();for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);e[a][b]=e[b][a]=0;}dfs(1);cout<<bestcn<<endl;for(int i=1;i<=n;i++){if(best[i]==1){cout<<i<<" ";}}cout<<endl;}return 0;
}

方法二:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxx=1005;
const int inf=0x3f3f3f3f;
//ans表示最大团,cnt[N]表示当前最大团的节点数,group[N]用以寻找一个最大团集合
//u为当从前顶点开始深搜,pos为深搜深度(即当前深搜树所在第几层的位置)
int group[maxx];
int cnt[maxx];
int ans;
int pos,n,m;
int e[maxx][maxx];
int vis[maxx];
void init(){memset(vis,0,sizeof(vis));memset(cnt,0,sizeof(cnt));memset(group,0,sizeof(group));memset(e,1,sizeof(e));
}
int dfs(int u,int pos){for(int i=u+1;i<=n;i++){//按递增顺序枚举顶点if(cnt[i]+pos<=ans){return 0;//剪枝}if(e[u][i]){int j;// 与目前团中元素比较,取 Non-N(i)for(j=0;j<pos;j++){if(!e[i][vis[j]]){break;}}// 若为空,则皆与 i 相邻,则此时将i加入到 最大团中//深搜层次也就是最大团的顶点数目,vis[pos] = i表示当前第pos小的最大团元素为i(因为是按增顺序枚举顶点 )if(j==pos){vis[pos]=i;if(dfs(i,pos+1)){return 1;}}}}if(pos>ans){for(int i=0;i<pos;i++){group[i]=vis[i];// 更新最大团元素}ans=pos;return 1;}return 0;
}
void Bron_Kerbosch(){ans=-1;for(int i=n;i>=1;i--){vis[0]=i;dfs(i,1);cnt[i]=ans;}
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);init();for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);e[a][b]=e[b][a]=0;}//相邻顶点间有边相连,模型转换成求 无向图 最大独立集。//要求原图的最大独立集,转化为求原图的补图的最大团(最大团顶点数量 = 补图的最大独立集)Bron_Kerbosch();cout<<ans<<endl;for(int i=0;i<n;i++){if(group[i]!=0)cout<<group[i]<<" ";}cout<<endl;}return 0;
} 

从时间上看,两个算法的时间复杂度相差不是很大,但是当输入量变多时,两个方法的时间复杂度将非常的明显!

poj1419(最大独立集)相关推荐

  1. poj1419 Graph Coloring 最大独立集(最大团)

    最大独立集: 顶点集V中取 K个顶点,其两两间无连接. 最大团: 顶点集V中取 K个顶点,其两两间有边连接. 最大独立集=补图的最大团 最大团=补图的最大独立集 #include<iostrea ...

  2. hdu3829(最大独立集)

    传送门:Cat VS Dog 题意:动物园有N只猫,M只狗,P个小孩.每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他讨厌狗,那么他就喜欢猫.某个小孩能开心,当且仅当他喜欢 ...

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

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

  4. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  5. 二分图HK算法[数论+二分图最大独立集]:Lightoj1356

    Prime Independence LightOJ - 1356 题目大意:给你n个数,你从这个集合中挑选出若干个数,使得这个集合的数里面两两之间a/b!=k[k是质数并且a>b]a/b!=k ...

  6. 二分图专题系列各大知识点总结(匈牙利,染色法,最大独立集,最小点覆盖,最小路径覆盖)

    本文概论 二分图的判断方法:图中不存在奇数环----->染色法判断二分图不存在矛盾 二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i, ...

  7. 解题报告:X、骑士共存问题(最大独立集)(匈牙利 / 最大流)

    X.骑士共存问题(最大独立集)(匈牙利 / 最大流) 题目链接 [问题分析] 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同.把所有可 ...

  8. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

  9. poj3692(二分图最大独立集)

    题目大概意思为有G个女生和B个男生,每个男生都相互认识,每个女生也相互认识,部分男生与部分女生相互认识,求最大相互认识的点集 题目很简单,只用稍微转换一下思路即可,因为我们要以男生与女生来构建二分图, ...

最新文章

  1. OpenvSwitch — 核心对象
  2. Maven中使用本地JAR包
  3. 898 C. Phone Numbers
  4. 实用的无锁队列(一)
  5. axios的二次封装与async,await的配合使用?
  6. python 多分类 recall_sklearn多分类问题
  7. Android下最简单的AudioTrack播放PCM的例子
  8. h5游戏引擎有哪些?h5制作模板游戏的教程和流程是什么?
  9. android cs bs 架构,BS架构与CS架构的区别
  10. oracle把中文转换成ascii,js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换XX函数代码...
  11. win7系统安装SQL Server 2005开发版步骤详解
  12. 利用PicGo快速获得图片外链(七牛云图床)
  13. 【DB笔试面试764】在Oracle中,逻辑DG维护中常用到的SQL语句有哪些?
  14. 基于HTML、CSS、JavaScript、jQuery的app小项目--简易备忘录
  15. [线段树][数学]JZOJ 4237 Melancholy
  16. 大一高级计算机考试内容,大一计算机考试内容
  17. flyme禁止系统更新_魅族怎么关闭系统更新
  18. 使用VB合并word文档内容
  19. C#窗体Click事件没反应
  20. Ubuntu下Qt软件打包流程

热门文章

  1. Emmet语法(快速生成HTML结构语法、快速生成CSS样式语法)
  2. 每个程序员都必须知道的 8 种数据结构
  3. 无人驾驶 | 为什么双目自动驾驶系统难以普及?
  4. 干货|深度学习之过拟合和正则化
  5. Python加速运行技巧
  6. 如何利用Tensorflow和OpenCV构建实时对象识别程序?
  7. 基于转移学习的图像识别
  8. 编程——无序数组中找到最大乘积(python)
  9. 洛谷2014选课(树型dp)
  10. 有向图最小路径覆盖方法浅析、证明 //hdu 3861