关于最大团问题
这是一个很典型的NP问题.很长一段时间一直在想如何解决它,直到那天看了一位前人推荐的文档,得到一些启发才顺利的解决了这个困扰我多天的问题.
典型描述:给定一个图G,要求G的最大团(团是指G的一个完全子图,该子图不包含在任何其他的完全子图当中。最大团指其中包含顶点最多的团).
该命题可以有很多变种,例如1002,1654的放机器人,实质上都是求最大团的问题,当然,由于问题的特殊性,他们或许还可以用其他更高效的算法来解.毕竟,问题抽象,解法一般后其实现难度和复杂度也会增大.
解决该问题的一般算法该是搜索.设其包含顶点a1,a2,a3,a4,a5·····an。从a1开始搜索,依次搜索所有与其相邻的点······典型的指数时间搜索。
那天看到一篇文章,专门论述了这个问题。它不是采用我们惯用的从a1开始搜索的方法,而是反了过来,从an开始走,当然,走的时候还是只向前走(a5开始,就只搜a6,a7······),这样做有什么好处呢?实际上类似于动态规划,这样我们每做的一次搜索都可以为后面的搜索所用,而我们先前的搜索方法则基本上每一次搜索都会从头开始去寻找最有解。并且,我们注意到这末一个结论:如果max【i】表示搜索a1得到的解,则max【i-1】=max【i】+1或者max【i】。这个结论是很明显的。如果ai~an的点可能形成的最大完全图含Max【i】个接点,则a(i-1)~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];