题目:传送
题意:
给你一个图,问你此图能然多少黑点。染黑点的条件是相邻点不能有黑点。
一开始搜题意的时候都说是啥 啥最大独立集。果断认为不会。
后来桌椅大神说,dfs加剪枝就行。然后连简直都没加写的。47ms。
思路:
默认都是白色的,1.可以染,然或者不染,回溯;
2不可以染,回溯。
上代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int map[101][101];
bool col[101];
int ans[101];
int num;
int len,maxl;
bool is(int b)
{
for(int i=1;i<=n;i++)
{
if(map[b][i] && col[i]) return 0;
//else return 1;
}
return 1;
}
void dfs(int a)
{
if(a>n)
{
if(len>maxl)
{
maxl=len;
num=1;
for(int i=1;i<=n;i++)
{
if(col[i])
ans[num++]=i;
}
}
return;
}
if(is(a))
{
col[a]=1;//染
len++;
dfs(a+1);
col[a]=0;//不染
len--;
}
dfs(a+1);
}
int main(){
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
memset(col,0,sizeof(col));
memset(ans,0,sizeof(ans));
int x,y;
len=maxl=0;
while(m--)
{
scanf("%d%d",&x,&y);
map[x][y]=map[y][x]=1;
}
dfs(1);
printf("%d\n",maxl);
for(int i=1;i<=maxl;i++)
{
printf("%d ",ans[i]);
}
printf("\n");
}
}