当作一道枚举的样例来看吧,个人感觉比依据 子节点 去DFS 省很多事
#include<stdio.h>
#include<string.h>
int map[105][105];
int color[105], ans[105];
int n, m, times, black, maxn = 0;
void Test()
{
int i;
if (black > maxn)
{
maxn = black;
for (i = 1 ; i <= n ; i++)
ans[i] = color[i];
}
}
void DFS(int p) //对每个点枚举。。。
{
int i, able = 1;
for (i = 1 ; i <= n ; i++)
if (map[i][p] && color[i] && i != p) able = 0;//颜色冲突了,枚举下一个点
if (able)
{
color[p] = 1;//涂色
black++;
if (p < n) DFS(p + 1);//这个涂色情况下 枚举下一个点
else Test();
color[p] = 0;
black--;
}
if (p < n) DFS(p + 1);//不涂色情况下
else Test();
}
int main()
{
int i, s, t;
for (scanf("%d", ×) ; times > 0 ; times--)
{
maxn = black = 0;
memset(map, 0, sizeof(map));
memset(color, 0, sizeof(color));
memset(ans, 0, sizeof(ans));
scanf("%d%d", &n, &m);
for (i = 0 ; i < m ; i++)
{
scanf("%d%d", &s, &t);
map[s][t] = map[t][s] = 1;
}
DFS(1);
printf("%d\n", maxn);
for (i = 1 ; i <= n ; i++)
if (ans[i]) printf("%d ", i);
printf("\n");
}
return 0;
}