查了很多资料,看了很多课件..
这种NP难问题.. 确实什么轻易的解法... 长路漫漫。
直接求最大独立集的方法能写了,最大团怎么求呢?
另外吐槽一句:网上很多题解中都有最大独立集=补图的最大团。这没错。
但是,很多都有一句下面是求最大团的代码.. 我去.. 概念清楚了再来写题解好么.. 吐槽完毕.
#include<iostream>
using namespace std;
int N,M;
struct Edge
{
int v,next;
}E[111111];
int ptr[111],ans,Edgenum,set[111],f[111];
int len;
void addEdge( int u,int v )
{
E[Edgenum].v=v;
E[Edgenum].next=ptr[u];
ptr[u]=Edgenum++;
}
void dfs( int cur ,int num )
{
if( cur>N )
{
if( num>ans )
{
ans=num;
len=0;
for( int i=1;i<=N;i++ )
if( set[i] )
f[len++]=i;
}
return ;
}
bool flag=1;
for( int i=ptr[cur];i!=-1;i=E[i].next )
{
if( set[E[i].v] )
{
flag=0;
break;
}
}
if( flag )
{
set[cur]=1;
dfs(cur+1,num+1);
set[cur]=0;
}
if( num+(N-cur)>ans )
dfs( cur+1,num );
}
int main()
{
int T;
scanf( "%d",&T );
while( T-- )
{
memset( ptr,-1,sizeof(ptr) );
memset( set,0,sizeof(set) );
ans=0;Edgenum=0;
scanf( "%d %d",&N,&M );
for( int i=0;i<M;i++ )
{
int u,v;
scanf( "%d %d",&u,&v );
addEdge( u,v );
addEdge( v,u );
}
dfs(1,0);
printf( "%d\n",ans );
printf( "%d",f[0] );
for( int i=1;i<len;i++ )
printf( " %d",f[i] );
printf( "\n" );
}
return 0;
}