UVA 193 图着色

来源:互联网 发布:mac 多个全屏切换 编辑:程序博客网 时间:2024/05/05 02:40

深度优先搜索回溯法,数据量不算很大,可以采用暴力解决

剪枝:1.如果当前结点相邻结点为黑色,则必为白色,否则先黑色再回溯白色

            2.如果当前结点数目最终理想值比已有结点数目少,则不必继续搜索

图搜索不一定要相邻结点依次进行

#include <iostream>#include <sstream>#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <vector>#include <set>#include <cctype>#include <algorithm>#include <cmath>#include <deque>#include <queue>#include <map>#include <stack>#include <list>#include <iomanip>using namespace std;///#define INF 0xffffff7#define maxn 110///int m;int n, k;int graph[110][110];int color[110];bool vis[110][110];int blackNodes;int maxblackNodes;int ans[110];void dfs(int cur, int blacks)//当前搜索到的结点个数,已经计算出的黑色结点个数,根据周边结点判定当前结点颜色{int i, j;if (cur > n){if (blacks > maxblackNodes){maxblackNodes = blacks;for (i = 0; i <= n; i++)ans[i] = color[i];}return;}bool flag = true;for (i = 0; i <= n; i++){if (graph[cur][i] == 1 && color[i] == 1){flag = false;break;}}if (blacks + n - cur + 1 <= maxblackNodes)return;if (flag){color[cur] = 1;dfs(cur + 1, blacks + 1);color[cur] = 0;}dfs(cur + 1, blacks);}int main(){///int i, j;cin >> m;while (m--){memset(graph, 0, sizeof(graph));memset(color, 0, sizeof(color));memset(ans, 0, sizeof(ans));maxblackNodes = 0;cin >> n >> k;for (i = 0; i < k; i++){int iEdge, oEdge;cin >> iEdge >> oEdge;graph[iEdge][oEdge] = graph[oEdge][iEdge] = 1;}dfs(1, 0);cout << maxblackNodes << endl;bool first = true;for (i = 0; i <= n; i++){if (ans[i] == 1){if (first)first = false;elsecout << " ";cout << i;}}cout << endl;}    ///    return 0;}