博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 193 - Graph Coloring
阅读量:5036 次
发布时间:2019-06-12

本文共 1568 字,大约阅读时间需要 5 分钟。

dfs;

按照 写的,大致思路是:

刚开始所有点没有着色,且最终结果至少有一个点被着黑色(一个点时直接着黑色,多个点时,可以任选一个点为黑色,其余点全为白色);

枚举这个黑色的点,并且把与它相邻的点都着白色,剩下的可以看作是一个相同的子问题了,因为剩下的点都不与这个黑色的点相邻。

最优解满足:每个白色的点至少与一个黑色的点相邻(如果这个点相邻的都是白色,可以把它改为黑色),且每个黑色的点周围都是白色。

# include 
# include
# define N 105int n, m, ans;char g[N][N], c[N], f[N];void dfs(int cnt, int k){ int i, j, top, s[N]; if (cnt >= n && k > ans) { ans = k; memcpy(f, c, sizeof(f)); return ; } for (i = 1; i <= n; ++i) { if (!c[i]) { c[i] = 2; /* black */ top = 0; s[top++] = i; for (j = 1; j <= n; ++j) if (g[i][j] && !c[j]) { c[j] = 1; /* white */ s[top++] = j; } dfs(cnt+top, k+1); for (; top;) c[s[--top]] = 0; } } return ;}int main(){ char first; int T, i, u, v; scanf("%d", &T); while (T--) { memset(g, 0, sizeof(g)); scanf("%d%d", &n, &m); for (i = 0; i < m; ++i) { scanf("%d%d", &u, &v); g[u][v] = g[v][u] = 1; } ans = 0; memset(c, 0, sizeof(c)); memset(f, 0, sizeof(f)); dfs(0, 0); printf("%d\n", ans); first = 1; for (i = 1; i <= n; ++i) if (f[i] == 2) { if (first) first = 0; else putchar(' '); printf("%d", i); } putchar('\n'); } return 0;}

//

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/07/07/2580349.html

你可能感兴趣的文章
JAVA设计模式之调停者模式
查看>>
[SHELL进阶] (转)最牛B的 Linux Shell 命令 (二)
查看>>
微信小程序开发6-WXSS
查看>>
css
查看>>
js 输入一段英语找出最长的英语单词
查看>>
学习笔记26— roc曲线(python)
查看>>
学习笔记80—火狐设置
查看>>
Windows下修改Git bash的HOME路径(转)
查看>>
第三章 TCP/IP
查看>>
【cocos2d-x制作别踩白块儿】第一期:游戏介绍
查看>>
operator= 复制操作符的意外
查看>>
杭电ACM1408——盐水的故事
查看>>
发现的最大数量
查看>>
Ubuntu12.04环境搭建遇到的问题和建议(一个)
查看>>
19.最经济app发短信的方法
查看>>
从零開始学android&lt;SeekBar滑动组件.二十二.&gt;
查看>>
教你用笔记本破解无线路由器password
查看>>
网络编程学习小结
查看>>
JS面向对象
查看>>
excel VLOOKUP函数的用法
查看>>