练习DFS。
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 102
using namespace std;
const int M = 1001;
const int INF = 0X3F3F3F3F;
int G[M][M];
bool color[M], save[M];
int MAX;
int n, m;
int check(int u)
{
for(int v = 1; v <= n; v++)
{
if(G[u][v] && color[v])
return 0;
}
return 1;
}
void dfs(int u, int sum)
{
if(u > n)
{
if(MAX < sum)
{
MAX = sum;
memcpy(save, color, sizeof(color));
}
return ;
}
if(n-u+1+sum <= MAX) return ; //剪枝
if(check(u))
{
color[u] = 1;
dfs(u+1, sum+1);
color[u] = 0;
}
dfs(u+1, sum);
}
void init()
{
memset(G, 0, sizeof(G));
memset(color, 0, sizeof(color));
}
int main()
{
int T, flag;
scanf("%d", &T);
while(T--)
{
init();
flag = 1;
scanf("%d%d", &n, &m);
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = 1;
}
MAX = -INF;
dfs(1, 0);
printf("%d\n", MAX);
for(int i = 1; i <= n; i++)
if(flag && save[i])
{
printf("%d", i);
flag = 0;
}
else if(save[i])
{
printf(" %d", i);
}
printf("\n");
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 102
using namespace std;
const int M = 1001;
const int INF = 0X3F3F3F3F;
int G[M][M];
bool color[M], save[M];
int MAX;
int n, m;
int check(int u)
{
for(int v = 1; v <= n; v++)
{
if(G[u][v] && color[v])
return 0;
}
return 1;
}
void dfs(int u, int sum)
{
if(u > n)
{
if(MAX < sum)
{
MAX = sum;
memcpy(save, color, sizeof(color));
}
return ;
}
if(n-u+1+sum <= MAX) return ; //剪枝
if(check(u))
{
color[u] = 1;
dfs(u+1, sum+1);
color[u] = 0;
}
dfs(u+1, sum);
}
void init()
{
memset(G, 0, sizeof(G));
memset(color, 0, sizeof(color));
}
int main()
{
int T, flag;
scanf("%d", &T);
while(T--)
{
init();
flag = 1;
scanf("%d%d", &n, &m);
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = 1;
}
MAX = -INF;
dfs(1, 0);
printf("%d\n", MAX);
for(int i = 1; i <= n; i++)
if(flag && save[i])
{
printf("%d", i);
flag = 0;
}
else if(save[i])
{
printf(" %d", i);
}
printf("\n");
}
return 0;
}