先上最大团定义:

最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题,在国际上已有广泛的研究,而国内对MCP问题的研究则还处于起步阶段,因此,研究最大团问题具有较高的理论价值和现实意义。

最大团问题又称为最大独立集问题(Maximum Independent Set Problem)。启发式算法。确定性算法有回溯法分支限界法等,启发式算法、蚁群算法、顺序贪婪算法、DLS-MC算法和智能搜索算法等。

给定无向图G=(V,E)。如果UV,且对任意u,vU
有(u,v)  E,则称U 是G 的完全子图。

团就是完全子图

最大团就是点数最多的完全子图
通俗点讲就是在一个无向图中找出一个点数最多的完全图

英文描述如下:

Given a graph G(V, E), a clique is a sub-graph g(v, e), so that for all vertex pairs v1, v2 in v, there exists an edge (v1, v2) in e. Maximum clique is the clique that has maximum number of vertex.

独立思考算法:

n<=50
深搜? dfs(p); visit[p]=1;
1.
for(int i=1;i<=n;i++)
if(visit[i]==1)
dfs(i);
2.然后假设 i这个点就是在大团里面的啦:
如果存在 map[i][k]=0;
visit[k]=0; 代表不能选取(回溯时记得标志清理干净)
for(int i=1;i<=n;i++)
if(visit[i]==1)
dfs(i);
最后数visit的1的数目更新答案..... 显然这是暴力算法...不过先写一发,看看有多暴力


10s都T了...好怕怕。。

怎么优化?

最优化剪枝:      ans-现在团中节点>可加入节点(加入该剪枝已经可以过)
好吧 以递增顺序枚举点才是搜索剪枝王道
 1 2 3 4 5 这个状态就有  5!个不同的顺序描述方式
代码
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map> using namespace std; const int MAXN=60;
int N;
int Path[MAXN][MAXN];
int Set[MAXN];//用以寻找一个可能集合
int Ans; //判断新点是否与原集合里的点互相连通
bool is_clique( const int end, const int point )
{
for( int i=1; i<end; ++i )
{
if( !Path[ Set[i] ][point] )
{
return false;
}
}
return true;
}
//递归查找,查找算法简单明了,不再详说
void dfs( int depth, int now )
{
if( depth+N-now+1 <= Ans )
{
return;
}
for( int i=now; i<=N; ++i )
{
if( is_clique(depth+1, i) )
{
Set[depth+1]=i;
dfs( depth+1, i+1 );
}
}
if( depth > Ans )
{
Ans=depth;
}
}
int main()
{
freopen("in","r",stdin); while( scanf("%d", &N)!=EOF && N )
{
for( int i=1; i<=N; ++i )
{
for( int j=1; j<=N; ++j )
{
scanf("%d", &Path[i][j]);
}
}
Ans=0;
dfs( 0, 1 );
printf("%d\n", Ans);
}
return 0;
}
//还可以设置一个DP[MAXN],用以记录i~N点集合里最大团数,可以利用这一点剪枝. DP[n]=DP[n+1]+1 or DP[n+1];


有点慢 尝试加入DP剪枝。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map> using namespace std; const int MAXN=60;
int N;
int Path[MAXN][MAXN];
int Set[MAXN];//用以寻找一个可能集合
int Ans;
int DP[MAXN];
//判断新点是否与原集合里的点互相连通
bool is_clique( const int end, const int point )
{
for( int i=1; i<end; ++i )
{
if( !Path[ Set[i] ][point] )
{
return false;
}
}
return true;
}
//递归查找,查找算法简单明了,不再详说
void dfs( int depth, int now )
{
if( depth+N-now+1 <= Ans||depth+DP[now] <=Ans )
{
return;
}
for( int i=now; i<=N; ++i )
{
if( is_clique(depth+1, i) )
{
Set[depth+1]=i;
dfs( depth+1, i+1 );
}
}
if( depth > Ans )
{
Ans=depth;
}
}
int main()
{
// freopen("a.in","r",stdin); while( scanf("%d", &N)!=EOF && N )
{
for( int i=1; i<=N; ++i )
{
for( int j=1; j<=N; ++j )
{
scanf("%d", &Path[i][j]);
}
}
memset(DP,0,sizeof(DP));
Ans=0;
DP[N]=1;
for(int i=N-1;i>=1;i--)
{
Set[1]=i;
dfs( 1, i+1 );
DP[i]=Ans;
}
printf("%d\n", DP[1]);
}
return 0;
}

并没有多大效果...但是还是少了1s 不错了

【最大团】【HDU1530】【Maximum Clique】的更多相关文章

  1. HDU1530 Maximum Clique dp

    正解:dp 解题报告: 这儿是传送门 又是个神仙题趴QAQ 这题就直接说解法辣?主要是思想比较难,真要说有什么不懂的知识点嘛也没有,所以也就没什么好另外先提一下的知识点QAQ 首先取反,就变成了求最大 ...

  2. 回溯法——最大团问题(Maximum Clique Problem, MCP)

    概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...

  3. Maximum Clique

    Maximum Clique Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  4. hdu 1530 Maximum Clique (最大包)

    Maximum CliqueTime Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. maximum clique 1

    maximum clique 1 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言524288KSpecial Judge, 64bit IO Format: % ...

  6. 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集

    maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...

  7. ZOJ 1492 Maximum Clique 搜索最大团

    ZOJ1492 题意:给一个无向图 求最大团的大小.节点数小于50 数据有限,考虑记忆化搜索,方程很好给出. 令 Si={vi,vi+1.....vn} mc[i]表示Si最大团的大小,倒着推算. 必 ...

  8. 【HDU1530】【ZOJ1492】Maximum Clique

    Position: http://poj.org/problem?id=3241 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCod ...

  9. 2019 牛客多校五 F. maximum clique 1 (最大团)

    大意: 给定$n$个互不相同的数, 若两个数异或后二进制中$1$的个数不少于$2$则连边, 求最大团. 最大团转为补图最大独立集. 可以发现补图是二分图, 所以直接$dinic$即可. 最大独立集相当 ...

随机推荐

  1. Objective C - UIColor

    UIColor+Hex.h #import <UIKit/UIKit.h> @interface UIColor (Hex) + (UIColor *) colorWithHexStrin ...

  2. git 用户手册

    Git是一个分布式版本控制/软件配置管理软件,原来是linux内核开发者林纳斯·托瓦兹为了更好地管理linux内核开发而创立的.需要注意的是和GNU Interactive Tools,一个类似Nor ...

  3. Appium项目搭建 For windows

    1.appium又安装了最新版本,更新了,1.4.16.1,然后整理电脑的时候发现自动更新的时候不是在原来的地方进行覆盖,所以就重新安装了一遍,注意需要看下环境变量是否配置了(用户变量:C:\Appi ...

  4. iOS 性能优化:Instruments

    对于每位 iOS 开发者来说,代码性能是个避不开的话题.随着项目的扩大和功能的增多,没经过认真调试和优化的代码,要么任性地卡顿运行,要么低调地崩溃了之……结果呢,大家用着不高兴,开发者也不开心. 其实 ...

  5. c语言字符串比较函数strcmp

    strcmp(s1,s2) 说明: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0两个字符串自左向右逐个字符相比(按ASCII值大小相比较) ...

  6. TCP的拥塞控制(转载)

    1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...

  7. 2、vector的实现

            看侯捷老师的<STL源码剖析>有一段时间了,打算自己整理一下思路,试着实现一下.主要目的有两个:1.巩固自己对源码的理解,让自己更加深刻的体会其中各种机制的奥妙.别人的知识 ...

  8. 函数 - PHP手册笔记

    用户自定义函数 函数无需在调用前被定义,除非是有条件定义的. PHP中的所有函数和类都具有全局作用域.PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数. 特意试了下,我的电脑上的PHP递归 ...

  9. Windows下使用TensorFlow

    上一篇日志(http://www.cnblogs.com/huidong/p/5426556.html)写了如何在Windows下安装Docker,并且在VM上安装TensorFlow. 在Windo ...

  10. Python第一印象,大法好!

    为了用flask开发web应用,这两天就开始看了一点点Python.还没看到用Python写网站后台的那部分,就被其强大的数据处理能力和语法的灵活性吸引.肯定是我少见多怪,不过看到人家灵活使用Pyth ...