关于最大团问题,解zju1492

本文探讨了最大团问题,一个经典的NP问题,通过反向搜索策略解决,提供了一种动态规划的思路,并给出了ZJU1492问题的解答代码,讨论了算法的关键点和优化剪枝条件。
摘要由CSDN通过智能技术生成

                  关于最大团问题

这是一个很典型的NP问题.很长一段时间一直在想如何解决它,直到那天看了一位前人推荐的文档,得到一些启发才顺利的解决了这个困扰我多天的问题.

典型描述:给定一个图G,要求G的最大团(团是指G的一个完全子图,该子图不包含在任何其他的完全子图当中。最大团指其中包含顶点最多的团).

该命题可以有很多变种,例如1002,1654的放机器人,实质上都是求最大团的问题,当然,由于问题的特殊性,他们或许还可以用其他更高效的算法来解.毕竟,问题抽象,解法一般后其实现难度和复杂度也会增大.

解决该问题的一般算法该是搜索.设其包含顶点a1,a2,a3,a4,a5·····an。从a1开始搜索,依次搜索所有与其相邻的点······典型的指数时间搜索。

那天看到一篇文章,专门论述了这个问题。它不是采用我们惯用的从a1开始搜索的方法,而是反了过来,从an开始走,当然,走的时候还是只向前走(a5开始,就只搜a6,a7······),这样做有什么好处呢?实际上类似于动态规划,这样我们每做的一次搜索都可以为后面的搜索所用,而我们先前的搜索方法则基本上每一次搜索都会从头开始去寻找最有解。并且,我们注意到这末一个结论:如果maxi】表示搜索a1得到的解,则maxi1】=maxi】+1或者maxi】。这个结论是很明显的。如果aian的点可能形成的最大完全图含Maxi】个接点,则ai1)~an能形成的完全子图最多比前一个多1个顶点。这些给我们的搜索提供了一个很强的约束条件。

这里提供ZJU1492的解答源代码加以具体说明(TLE 2次 ,AC一次 3.09s):

#include<stdio.h>  

#include<string.h>

int joint[50][50];

int Size;

int MAX;

int DP[50];

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值