题意是求出最多的黑色圈圈数,并输出编号,两个黑色圈圈不能在一起。
刚开始的时候思路错了,想成了根据图走,各种判断,最后得出最大值,可这里的图可以是断的。。
参考了hcbbt的解题报告。
实际上只要判断和当前点相邻的点中有没有黑色就行,如果有,当前点就不能涂黑色。
如果没有,当前点可以涂黑色或者白色。
我要多做题啊啊啊啊啊啊嗷嗷嗷嗷嗷
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 110;
int col[MAXN], G[MAXN][MAXN];
int n, maxBlack, ans[MAXN];
void DFS(int cur, int cnt);
int main()
{
//freopen("input.txt", "r", stdin);
int T, m, i, j, a, b;
scanf("%d", &T);
while (T--)
{
bool first = true;
maxBlack = -1;
memset(G, 0, sizeof(G));
memset(col, 0, sizeof(col));
scanf("%d%d", &n, &m);
for (i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
G[a][b] = G[b][a] = 1;
}
DFS(1, 0);
printf("%d\n", maxBlack);
for (i = 1; i <= n; i++)
if (ans[i])
if (first)
{
printf("%d", i);
first = false;
}
else
printf(" %d", i);
printf("\n");
}
}
void DFS(int cur, int cnt)
{
if (cur == n + 1)
{
if (cnt > maxBlack)
{
maxBlack = cnt;
memcpy(ans, col, sizeof(col));
}
return;
}
for (int i = 1; i <= n; i++)
{
if (G[cur][i] && col[i])
{
DFS(cur + 1, cnt);
return;
}
}
col[cur] = 1;
DFS(cur + 1, cnt + 1);
col[cur] = 0;
DFS(cur + 1, cnt);
}