UVA - 193 Graph Coloring(回溯)

来源:互联网 发布:java接口有构造函数吗 编辑:程序博客网 时间:2024/06/10 07:37


 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.

 figure22
Figure: An optimal graph with three black nodes

Input and Output

The graph is given as a set of nodes denoted by numbers tex2html_wrap_inline33 , tex2html_wrap_inline35 , and a set of undirected edges denoted by pairs of node numbers tex2html_wrap_inline37tex2html_wrap_inline39 . 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


0 0
原创粉丝点击