题目大意:给出N个点,M条无向边,要求两个相连的点不能同是黑色,求这N个点最多有几个是黑色的
解题思路:判断相连的点是否有黑色的,如果有的话,就将其置为白色,如果相连的点没有黑色的话,表示该点可以表示为黑色或着白色,用回溯法进行回溯
#include<cstdio>
#include<cstring>
int g[110][100];
int ans[110];
int color[110];
int max;
int n , k;
void dfs(int cur, int num) {
if(cur > n) {
if(num > max) {
max = num;
int j = 0;
for(int i = 1 ; i <= n; i++)
if(color[i])
ans[j++] = i;
}
}
else {
for(int i = 1 ; i <= n; i++)
if( color[i] && g[cur][i]) {
dfs(cur+1,num);
return ;
}
color[cur] = 1;
dfs(cur+1,num+1);
color[cur] = 0;
dfs(cur+1,num);
}
}
int main() {
int test;
int n1,n2;
scanf("%d",&test);
while(test--) {
scanf("%d%d",&n,&k);
memset(g,0,sizeof(g));
for(int i = 0; i < k; i++) {
scanf("%d%d",&n1,&n2);
g[n1][n2]++;
g[n2][n1]++;
}
max = 0;
dfs(1,0);
printf("%d\n",max);
for(int i = 0; i < max - 1; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[max-1]);
}
}