HDU1530(最大团问题)
1定义:
其中,形式参数t表示第t个顶点,Place(t)用来判断第t个顶点能否放入团里。二维数组a[][]是图的邻接矩阵。一维数组x[]记录当前解。搜索到第t层时,从第1 个顶点用第t-1个顶点的状态存放入在x[1:t-1]中;一维数组bestx记录当前最优解,变量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;
int cn;
int bestcn;
void init(){cn=0;bestcn=0;ans=0;memset(x,0,sizeof(x));memset(e,0,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){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(){while(scanf("%d",&n)!=EOF){if(n==0)break;init();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&e[i][j]);}}dfs(1);cout<<bestcn<<endl;}return 0;
}
时间复杂度上有很大的优化。
方法二:Bron–Kerbosch算法:
#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,0,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(){while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&e[i][j]);}}//相邻顶点间有边相连,模型转换成求 无向图 最大独立集。//要求原图的最大独立集,转化为求原图的补图的最大团(最大团顶点数量 = 补图的最大独立集)Bron_Kerbosch();if(ans==-1){cout<<0<<endl;}else{cout<<ans<<endl;}}return 0;
}
HDU1530(最大团问题)相关推荐
- hdu1530 最大团简单题目
题意: 给你一个无向图,让你找到这个图里面的最大团是多少. 思路: 最大图案是NP问题,直接暴力搜索,如果当前的这个点可以加入当前最大团,那么就选择加入或者舍去,如果不能加入, ...
- 【最大团】【HDU1530】【Maximum Clique】
先上最大团定义: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题,在国际上已有广泛的研究,而国内对MCP问题的研究则还处于起步 ...
- hdu3585 二分最大团(dp优化)
题意 给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路: 求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...
- 图论 —— 最大团问题
[问题描述] 当 G′ 是图 G 的子图,且 G′ 是关于 V′ 的完全图时,子图 G' 为图 G 的团:当 G' 是团,且不是其他团的子集时,G' 为图 G 的极大团:当 G' 是极大团时,且点数最 ...
- 无向图的最大团/最大独立集 算法总结
无向图的最大团/最大独立集 算法总结 目录 概述 普通DFS Bron-Kerbosch算法 概述 最大团其实就是最大完全子图的点集,同理极大团也就是极大完全子图的点集,点集内所有的点两两之间都有边相 ...
- 2022-2028年中国团购行业投资分析及前景预测报告
[报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了团购行业相关概述.中国团购行业运行环境.分析了中国团购行业的现状.中 ...
- 消息延迟队列处理拼团时间到期
1.RabbitMqConfig /*** * 延时队列交换机* * 注意这里的交换机类型:CustomExchange* ** * @return* */ @Bean public CustomEx ...
- 飞桨领航团 x Datawhale联合Meetup来了!杭州的小伙伴可以见面了!
Datawhale线下 主办:百度飞桨,Datawhale 飞桨领航团是飞桨开发者的兴趣社区,为开发者们提供丰富的本地技术沙龙.Meetup.及线上交流平台,面向所有对人工智能及深度学习领域感兴趣的开 ...
- 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...
刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...
最新文章
- [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树
- 巧用row_number和partition by分组取top数据
- python3默认使用的编码是_python3里的中文编码是什么?
- 【CentOS Linux 7】实验6【web服务器搭建与管理】
- 直播安装vnc连接树莓
- java椭圆_如何用java画椭圆
- [xsy3132]数表
- Mac上command not found: vituralenv
- 移动web-触摸事件touch
- python编程入门自学
- 什么是TPS,什么是QPS,区别是什么?
- 解决联想小新air13pro笔记本电脑插入耳机没声音的问题
- 计算机网卡更改mac地址,Mac电脑网卡MAC地址修改的具体步骤
- 国际象棋AI(三)---评估
- 利用python中basemap库绘制地图
- 游戏出海市场广阔,渠道差异及发行策略应受到企业关注
- 连锁零售行业IT运维管理四大困境
- spring cloud 快速上手系列 -> 04-网关 Gateway -> 041-空的工程
- c++从零开始---文章导读
- 企业网管常见问题解决集合