UVA193

来源:互联网 发布:人工智能对人类的危害 编辑:程序博客网 时间:2024/06/14 13:23

题目的意思是给输入的图涂颜色,只能涂成黑色或白色,而且不能相连的两点都是黑色,都是白色没关系。。

问怎么涂黑色最多,哪几个是黑色;


思路就是首先把点都涂成白色。

然后从第一个点开始递归,如果这个点的所有相连点都是白色,那么把它涂成黑色,进行递归,然后不涂成黑色也进行递归(回溯的思想);

#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代码:



0 0