#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int NN=102;
int n,ans,cnt,x[NN],opt[NN];
bool map[NN][NN];
void dfs(int i)
{
if (i>n)
{
ans=cnt;
for (int i=1; i<=n; i++) opt[i]=x[i];
return;
}
bool flag=true;
for (int j=1; j<i && flag; j++)
if (x[j]==1 && !map[j][i]) flag=false;
if (flag)
{
x[i]=1;
cnt++;
dfs(i+1);
cnt--;
}
if (cnt+n-i>ans)//可行性剪枝
{
x[i]=0;
dfs(i+1);
}
}
int main()
{
int cas,m,x,y;
scanf("%d",&cas);
while (cas--)
{
scanf("%d%d",&n,&m);
memset(map,1,sizeof(map)); //反图
for (int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
map[x][y]=map[y][x]=0; //反图
}
ans=cnt=0;
dfs(1); //求反图最大团
printf("%d\n",ans);
for (int i=1; i<=n; i++)
if (opt[i]) printf("%d ",i);
printf("\n");
}
return 0;
}
POJ1419-最大团
最新推荐文章于 2021-05-14 12:29:22 发布