Sujeto a
- Todo lado tiene al menos un extremo en la cubierta:
SALIDA: El menor número k tal que exista una cobertura de vértices S para G de tamaño k.
Equivalentemente, el problema puede definirse como un problema de decisión:
ENTRADA: Grafo G y un entero positivo k.
PREGUNTA: ¿Existe una cobertura de vértices S para G de tamaño menor o igual a k?
Estructuras para representarlo
Matriz de incidencia – El grafo está representado por una matriz de A (aristas) por V (vértices), donde [arista, vértice] contiene la información de la arista (1 – conectado, 0 – no conectado)
Matriz de adyacencia – El grafo está representado por una matriz cuadrada M de tamaño n2, donde n es el número de vértices. Si hay una arista entre un vértice x y un vértice y, entonces el elemento mx,y es 1, de lo contrario, es 0
Tomaremos como datos de entrada
vértices , aristas.
Resultados del Generador:
#include<stdio.h> #include<time.h> #include<string.h> int conectado(float densidad); main(int argc, char *argv[]){ int vertices; // Cantidad de vertices int aristas; int maxar; // Numero maximo de aristas float densidad; int i, j, objetos=0; char linea[50]; FILE *datos; datos = fopen(argv[1],"r"); if(datos!=NULL){ printf("\nLeyendo instancia del archivo: %s \n\n", argv[1]); do{ fgets(linea, 100, datos); if(strlen(linea)==0){ continue; } if(linea[0]=='#'){ printf("Comentario: %s \n", linea); } if(linea[0]=='a'){ objetos += 1; printf("%s", linea); } }while(!feof(datos)); printf("Son %d aristas en la instancia. \n", objetos); } else{ vertices = atoi(argv[1]); aristas = atoi(argv[2]); maxar = (vertices*(vertices-1))/2; if(aristas<vertices || aristas>maxar){ printf("\n\nError: El numero de aristas no puede ser menor al numero de vertices"); return 0; } printf("Generando conexiones al azar entre %d vertices y %d aristas \n", vertices, aristas); datos = fopen("datos.txt","w"); densidad = (float)(2*aristas)/(float)(vertices*(vertices-1)); fprintf(datos, "i %d %d %f\n", vertices, aristas, densidad); fprintf(datos, "# Instancia generada para %d vertices y %d aristas \n\n", vertices, aristas); int g[vertices+1][maxar+1]; printf("Maximo de aristas: %d \n", maxar); printf("Densidad: %f \n", densidad); srand(time(NULL)); for(i=1;i<=vertices;i++){ for(j=i;j<=maxar;j++){ g[i][j] = conectado(densidad); if(g[i][j]==1){ printf("%d - %d \n", i, j); fprintf(datos, "a %d - %d \n", i, j); } } } } return 0; } int conectado(float densidad){ float num; int x; num = (rand() % 10) + 0; num=num/10.00; if(num>=densidad){ x=1; }else{ x=0; } return(x); }
Otros generadores de Instancias en Vertex Cover:
http://www.nlsde.buaa.edu.cn/~kexu/benchmarks/graph-benchmarks.htm
http://cs.hbg.psu.edu/benchmarks/vertex_cover.html
Referencias
cobertura de vertices
Los benchmark están bien. Lo de la generación ahí va, pero no está en condiciones de generar la salida adequada aún y tampoco tienen la parte para la lectura de instancias desde archivos. Los if con un sólo = dan miedo. Van 5 pts por esta entrada.
ResponderEliminar