非自己出品就是容易wa啊,想了一会没想出来,就忍不住去找答案了,实在没忍住去找答案,结果还是wa了两
次,,,还是自己想的比较靠谱啊,
思路:
如果当前点可以被染成黑色,就把它染成黑色,继续深搜,之后回溯,把它染成白色
如果当前点只能被染成白色,就染成白色深搜
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int map[105][105];
int visit[105];
int ans[105],n,max;
void dfs(int cur, int sum)
{
int i,j;
if(cur > n)
{
if(sum > max)
{
max = sum;
for(i=1; i<=n; i++)
ans[i] = visit[i];
}
return ;
}
int flag = 1;
for(i=1; i<=n; i++)
{
if((map[cur][i] == 1) && (visit[i] == 1))
{
flag = 0;
break;
}
}
if(flag)
{
visit[cur] = 1;
dfs(cur+1, sum+1);
visit[cur] = 0;
}
dfs(cur+1,sum);
return ;
}
int main()
{
int T,m,i,a,b;
scanf("%d",&T);
while(T--)
{
max = 0;
memset(visit,0,sizeof(visit));
memset(map,0,sizeof(map));
memset(ans,0,sizeof(ans));
scanf("%d%d",&n,&m);
for(i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
map[a][b] = map[b][a] = 1;
}
dfs(1,0);
printf("%d\n",max);
int cnt = 0;
for(i=1; i<=n; i++)
{
if(ans[i] == 1)
{
printf("%d",i);
cnt++;
if(cnt != max)
printf(" ");
}
}
puts("");
}
return 0;
}