集训队专题(5.1)1001 Maximum Clique

本文探讨了最大团问题的解决方法,介绍了DFS搜索的基本思路,并通过剪枝优化提高了算法效率。给出了一个求解最大团的模板代码,适用于多种最大团问题。详细解释了剪枝策略和代码实现细节。

Maximum Clique

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3490    Accepted Submission(s): 1873


Problem Description
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.
 

Input
Input contains multiple tests. For each test:

The first line has one integer n, the number of vertex. (1 < n <= 50)

The following n lines has n 0 or 1 each, indicating whether an edge exists between i (line number) and j (column number).

A test with n = 0 signals the end of input. This test should not be processed.
 

Output
One number for each test, the number of vertex in maximum clique.
 

Sample Input
  
5 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0
 

Sample Output
  
4
 

Author
CHENG, Long
 

Source
 

这就是一道纯粹的最大团问题。首先,小编这里给出教科书版本的对一些图论基本名词的介绍:

1.无向完全图:设G=(V,E)为N阶无向图,若G中的任何顶点都以其余的N-1个顶点相邻,则称G为N阶无向图。  

2.完全子图:给定G=(V,E),如果U为G的子图并且是完全图,则称为完全子图。

3.团:设U为G完全子图,当图U不包含G的更大完全子图时,称U是G的一个团。

4.最大团:G中所含顶点数最多的团。

有关求最大团的方法,一般的做法就是直接进行DFS搜索,而最朴素的DFS搜索便是:首先设最大团为一个空团,往其中加入一个顶点,然后依次考虑每个顶点,查看该顶点加入团之后仍然构成一个团,如果可以,考虑将该顶点加入团或者舍弃两种情况,如果不行,直接舍弃,然后递归判断下一顶点。

当然这样做肯定是对的,同样也能AC的了,但是你会发现运行时间会是几秒,相当的慢。不难想到,原因是因为我们搜索了大量肯定不会是极大团的点,所以在优化方面我们需要进行必要的剪枝。

很容易想到一个很简单的剪枝,就是当剩下的点全部加入当前团中都不大于当前最大团时就可以直接return。

再进行思考,因为这里我们的是无向图,所以假如1,2,3,4,5这五个点构成了极大团,那我们在搜索的时候可能就会按不同的顺序搜索了5! = 120次,小编这里把图当做有向图,点全部都从小编号点搜索到大编号的点,这样我们的方法就进一步的得到了优化。当然,小编这样的优化并不一定是最好的优化方法,小编也是跑了1000MS+才AC的,有些大神只需要几百MS就跑完了(牛逼啊!!!)。

这里小编给出我自己的最大团模板,很多最大团的题,都是可以直接套模板的。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=106;
int g[maxn][maxn],dp[maxn],stk[maxn][maxn],mx;
//int path[maxn],res[maxn];//记录最大团的点 
int dfs(int n,int ns,int dep)//
{
	if(ns == 0)
	{
		if(dep > mx)
		{
			//swap(path,res);
			mx = dep;
			return 1;
		}
		return 0;
	}
	int i,j,k,p,cnt;
	for(i=0; i<ns; i++)
	{
		k = stk[dep][i];
		cnt = 0;
		if(dep + n - k <= mx) return 0;// 剪枝1, 若当前 顶点数量cnt 加上还能够增加的最大数量 仍小于 best则 退出并返回
		if(dep + dp[k] <= mx) return 0;// 剪枝2, 若当前 顶点数量cnt 加上 包含adj[i]的最大团顶点数 仍小于 best则 退出并返回
		for(j=i+1; j<ns; j++)
		{
			p = stk[dep][j];
			if(g[k][p]) stk[dep+1][cnt++] = p;
		}
		//path[dep+1] = k;
		if( dfs(n,cnt,dep+1) ) return 1;
	}
	return 0;
}
int clique(int n)
{
	int i,j,ns;
	for(mx=0, i=n-1; i>=0; i--)
	{
		//path[1] = i;
		for(ns=0, j=i+1; j<n; j++)// 遍历 [i+1, n] 间顶点
			if(g[i][j]) stk[1][ns++] = j;
		dfs(n,ns,1);
		dp[i] = mx;// 得出顶点 i, 出发构成最大团 中顶点数量
	}
	return mx;
}
int main()
{
	int n;
	while(scanf("%d",&n)&&n!=0)
	{
		for(int i=0; i<n; i++)
			for(int j=0; j<n; j++)
				scanf("%d",&g[i][j]);
		int ans = clique(n);
		printf("%d\n",ans);
		/*for(int i=1; i<=ans; i++)
		{
			printf("%d",res[i]+1);
			if(i == ans) printf("\n");
			else printf(" ");
		}*/
	}
	return 0;
}


源码来自:https://pan.quark.cn/s/fdd21a41d74f 正方教务管理系统成绩推送 简介 使用本项目前: 早晨睡醒看一遍教务系统、上厕所看一遍教务系统、刷牙看一遍教务系统、洗脸看一遍教务系统、吃早餐看一遍教务系统、吃午饭看一遍教务系统、睡午觉前看一遍教务系统、午觉醒来看一遍教务系统、出门前看一遍教务系统、吃晚饭看一遍教务系统、洗澡看一遍教务系统、睡觉之前看一遍教务系统 使用本项目后: 成绩更新后自动发通知到微信 以节省您宝贵的时间 测试环境 正方教务管理系统 版本 V8.0、V9.0 如果你的教务系统页面与下图所示的页面完全一致或几乎一致,则代表你可以使用本项目。 目前支持的功能 主要功能 每隔 30 分钟自动检测一次成绩是否有更新,若有更新,将通过微信推送及时通知用户。 相较于教务系统增加了哪些功能? 显示成绩提交时间,即成绩何时被录入教务系统。 显示成绩提交人姓名,即成绩由谁录入进教务系统。 成绩信息按时间降序排序,确保最新的成绩始终在最上方,提升用户查阅效率。 计算 计算百分制 对于没有分数仅有级别的成绩,例如”及格、良好、优秀“,可以强制显示数字分数。 显示未公布成绩的课程,即已选课但尚未出成绩的课程。 使用方法 Fork 本仓库 → 开启 工作流读写权限 → → → → → 添加 Secrets → → → → → → Name = Name,Secret = 例子 程序会自动填充 尾部的 ,因此你无需重复添加 对于部分教务系统,可能需要在 中添加 路径,如: 开启 Actions → → → 运行 程序 → → 若你的程序正常运行且未报错,那么在此之后,程序将会每隔 30 分钟自动检测一次成绩是否有更新 若你看不懂上述使用...
综合能源系统零碳优化调度研究(Matlab代码实现)内容概要:本文围绕“综合能源系统零碳优化调度研究”,提供了基于Matlab代码实现的完整解决方案,重点探讨了在高比例可再生能源接入背景下,如何通过优化调度实现零碳排放目标。文中涉及多种先进优化算法(如改进遗传算法、粒子群优化、ADMM等)在综合能源系统中的应用,涵盖风光场景生成、储能配置、需求响应、微电网协同调度等多个关键技术环节,并结合具体案例(如压缩空气储能、光热电站、P2G技术等)进行建模与仿真分析,展示了从问题建模、算法设计到结果验证的全流程实现过程。; 适合人群:具备一定电力系统、能源系统或优化理论基础,熟悉Matlab/Simulink编程,从事新能源、智能电网、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展综合能源系统低碳/零碳调度的科研建模与算法开发;②复现高水平期刊(如SCI/EI)论文中的优化模型与仿真结果;③学习如何将智能优化算法(如遗传算法、灰狼优化、ADMM等)应用于实际能源系统调度问题;④掌握Matlab在能源系统仿真与优化中的典型应用方法。; 阅读建议:建议结合文中提供的Matlab代码与网盘资源,边学习理论模型边动手调试程序,重点关注不同优化算法在调度模型中的实现细节与参数设置,同时可扩展应用于自身研究课题中,提升科研效率与模型精度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值