看着人家的代码写就是不好,还错了好几次,虽说简单还是自己靠得住。虽然可以用最大团求解,但直接枚举就好了。
规模小,看这个题就知道是求最大独立集,而最大独立集+最小覆盖集=定点个数,而原图最大团=补图最大独立集。各种性质。
#include <stdio.h>
#include <string.h>
#define N 105
bool g[N][N], color[N], mk[N];
int n, m, ans;
bool ok(int u)
{
for(int i = 1; i <= n; i++)
{
if(g[u][i] && color[i]) return 0;
}
return 1;
}
void dfs(int u, int cnt)
{
if(u > n)
{
if(cnt > ans)
{
ans = cnt;
for(int i = 1; i <= n; i++) mk[i] = color[i];
}
return;
}
if(cnt + n - u + 1 <= ans) return;
if(ok(u))
{
color[u] = 1;
dfs(u + 1, cnt + 1);
color[u] = 0;
}
dfs(u + 1, cnt);
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
ans = 0;
memset(g, 0, sizeof(g));
memset(mk, 0, sizeof(mk));
memset(color, 0, sizeof(color));
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
int a, b;
scanf("%d %d", &a, &b);
g[a][b] = g[b][a] = 1;
}
dfs(1, 0);
printf("%d\n", ans);
bool flag = 1;
for(int i = 1; i <= n; i++)
{
if(mk[i])
{
if(flag) flag = 0;
else printf(" ");
printf("%d", i);
}
}
printf("\n");
}
return 0;
}