UVA - 193 Graph Coloring(回溯)
来源:互联网 发布:java接口有构造函数吗 编辑:程序博客网 时间:2024/06/10 07:37
Graph Coloring
Graph Coloring
You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the graph and the only available colors are black and white. The coloring of the graph is called optimal if a maximum of nodes is black. The coloring is restricted by the rule that no two connected nodes may be black.
Figure: An optimal graph with three black nodes
Input and Output
The graph is given as a set of nodes denoted by numbers , , and a set of undirected edges denoted by pairs of node numbers , . The input file contains m graphs. The number m is given on the first line. The first line of each graph contains n and k, the number of nodes and the number of edges, respectively. The following k lines contain the edges given by a pair of node numbers, which are separated by a space.
The output should consists of 2m lines, two lines for each graph found in the input file. The first line of should contain the maximum number of nodes that can be colored black in the graph. The second line should contain one possible optimal coloring. It is given by the list of black nodes, separated by a blank.
Sample Input
16 81 21 32 42 53 43 64 65 6
Sample Output
31 4 5
题目大意:图上的点染色,两连通的点不能都染成黑色,问最多可以染多少黑色。
解析:我真是太笨了还去开vis数组,判断连通性,这是没有必要的,直接用dfs回溯即可。
先判断和当前点相连的点是否染成黑色,看这一点是否能染黑色,能染色就分染成黑色和白色两种情况递归,如果不能就单递归白色。
#include <stdio.h>#include <string.h>const int N = 110;const int INF = 0x3f3f3f3f;int edge[N][N];bool black[N]; //判断该节点是否是黑色int ans[N],t[N];int max;int m,n,p;bool judge(int u) {for(int i = 1; i <= n; i++) {if(edge[u][i] && black[i]) {return false;}}return true;}void dfs(int cur) {if(cur == n+1) {p = 0;for(int i = 1; i <= n; i++) {if(black[i]) {t[p++] = i;}}if( p > max) {max = p;for(int i = 0; i < max; i++) {ans[i] = t[i];}}return ;}if(judge(cur)) { // 判断cur节点,周围是否有黑色black[cur] = true; //如果周围没有黑色,就把它标记为黑色dfs(cur+1);black[cur] = false;}dfs(cur+1); //白色节点}int main() {int t;int u,v;while(scanf("%d",&t) != EOF) {while(t--) {scanf("%d%d",&n,&m);memset(edge,0,sizeof(edge));memset(black,0,sizeof(black));for(int i = 0; i < m; i++) {scanf("%d%d",&u,&v);edge[u][v] = edge[v][u] = true;}max = -INF;dfs(1);printf("%d\n",max);for(int i = 0; i < max-1; i++) {printf("%d ",ans[i]);}printf("%d\n",ans[max-1]);}}return 0;}
附上一组样例
input
4 5 0 8 4 1 2 3 4 5 6 6 8 2 1 1 2 20 19 1 10 2 5 3 4 4 9 5 17 6 4 8 19 9 13 10 11 11 14 12 1 13 6 14 3 15 4 16 5 17 8 18 9 19 15 20 4
output
51 2 3 4 551 3 5 7 811111 2 3 6 7 8 9 11 15 16 20
- uva - 193Graph Coloring(回溯)
- UVA - 193 Graph Coloring(回溯)
- uva 193 Graph Coloring(回溯)
- Graph Coloring +uva+回溯
- UVA Graph Coloring(DFS+回溯)
- uva 193 Graph Coloring( 图染色 ) DFS+回溯
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- UVA 193 Graph Coloring
- uva 193 Graph Coloring
- uva 193 Graph Coloring
- UVa:193 Graph Coloring
- UVa 193 - Graph Coloring
- UVA 193 - Graph Coloring
- sublime text 文本编辑器
- 机房收费系统——登录优化
- Path Sum
- Red5点播视频路径问题
- MySQL及图形程序MySQL workbeanch的安装方法
- UVA - 193 Graph Coloring(回溯)
- RabbitMQ三种分布式策略总结
- sublime text 3 常用快捷键收藏
- poj 百练 2808 校门外的树
- 使用SPSS进行Logistic Regression时应注意的问题
- 优秀博文分享
- Robberies+hdu+01背包问题
- 移动web开发经验总结
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)