Fotolog
Volver a la lista de problemas
Graph Coloring
193.c
#include <stdio.h>
#define VACIO 0
#define NEGRO 1 /* El resto: blanco */
int num_nodes;
int nodes[100];
int conn[100][100]; /* 1 if nodes i and j are connected */
int best_nodes[100];
int max_negros=0;
void
calc(int nodenum, int negros)
{
int i;
int all_done=0;
nodes[nodenum]=NEGRO;
negros++;
if (negros>max_negros) {
max_negros=negros;
all_done=1;
}
for(i=0; i<num_nodes; i++) {
if (conn[nodenum][i] && nodes[i]==VACIO) {
nodes[i]=10+nodenum; /* BLANCO */
}
}
for(i=0; i<num_nodes; i++) {
if (nodes[i]==VACIO) {
calc(i,negros);
all_done=0;
break;
}
}
if (all_done) {
memcpy(best_nodes, nodes, sizeof(nodes));
}
for(i=0; i<num_nodes; i++) {
if (nodes[i]==10+nodenum) {
nodes[i]=VACIO;
}
}
nodes[nodenum]=10+nodenum; /* BLANCO */
negros--;
for(i=0; i<num_nodes; i++) {
if (nodes[i]==VACIO) {
calc(i,negros);
break;
}
}
nodes[nodenum]=VACIO;
}
int
main(void)
{
int i,j,k;
int n,m;
int a,b;
scanf("%d", &n);
for(i=0; i<n; i++) {
scanf(" %d %d", &num_nodes, &m);
max_negros=0;
for(j=0; j<num_nodes; j++) {
nodes[j]=0;
for(k=0; k<num_nodes; k++) {
conn[j][k]=0;
}
}
for(j=0; j<m; j++) {
scanf(" %d %d", &a, &b);
conn[a-1][b-1]=1;
conn[b-1][a-1]=1;
}
calc(0,0);
printf("%d\n", max_negros);
a=0;
for(j=0; j<num_nodes; j++) {
if (best_nodes[j]==NEGRO) {
printf("%s%d", (a ? " " : ""), j+1);
a=1;
}
}
printf("\n");
}
exit(0);
}









