Fotolog

A través del espejo
2010-10-12: A través del espejo
¡La radio habla en binario!
2010-10-10: ¡La radio habla en binario!
Gigaminx (regalo por mi cumple)
2010-09-16: Gigaminx (regalo por mi cumple)
Trini en bici
2010-09-05: Trini en bici
Valporquero
2010-08-28: Valporquero
Mi bici nueva
2010-08-22: Mi bici nueva
Boda de Mario y Ana
2010-08-13: Boda de Mario y Ana
De cañones en Guara
2010-08-07: De cañones en Guara
Trini y Mari en Marbella
2010-08-05: Trini y Mari en Marbella
Trini y Chelo en Tabarca
2010-08-03: Trini y Chelo en Tabarca
Valid XHTML 1.1
Acceder
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);
}