题目的意思是给输入的图涂颜色,只能涂成黑色或白色,而且不能相连的两点都是黑色,都是白色没关系。。
问怎么涂黑色最多,哪几个是黑色;
思路就是首先把点都涂成白色。
然后从第一个点开始递归,如果这个点的所有相连点都是白色,那么把它涂成黑色,进行递归,然后不涂成黑色也进行递归(回溯的思想);
#include<iostream>
using namespace std;
const int N = 100 + 5;
int link[N][N];
int color[N];
int n,k,m;
int ok;
int ans[N];
void init () {
for (int i = 0 ; i < N ;i++) {
for (int j = 0 ; j < N ; j++) {
link[i][j] = 0;
}
color[i] = 0;
}
m = 0;
}
void dfs(int cur,int num) {
if (cur == n + 1) {
if (num > m ) {
m = num;
int temp = 0;
for (int i = 1 ; i <= n ; i++ ) {
if(color[i] == 1)
ans[temp++] = i;
}
}
return;
}
ok = 1;
for(int i = 1 ; i <= n ; i++) {
if (link[cur][i]) {
if (color[i] == 1) {
ok = 0;
break;
}
}
}
if (ok) {
color[cur] = 1;
dfs(cur + 1 ,num + 1);
}
color[cur] = 0;
dfs(cur + 1 ,num);
}
int main () {
int t ;
int op,ed;
cin >> t ;
while (t--) {
init();
cin >> n >> k;
while (k--) {
cin >> op >> ed;
link[op][ed] = link[ed][op] = 1;
}
dfs(1 , 0);
cout << m << endl;
for (int i = 0 ; i < m ; i++ ) {
cout << ans[i];
if (i != m - 1)
cout << " ";
}
cout <<endl;
}
}
AC代码: