1. Grafo genérico
Muchas soluciones a problemas pueden modelarse como grafos. Por ejemplo, redes sociales, redes de transporte, redes de comunicación, y circuitos electrónicos, entre otros. Sin embargo, la biblioteca estándar de C++ no incluye un tipo de datos abstracto para grafos. Cree un tipo de datos grafo genérico reutilizable capaz de representar grafos dirigidos o no, y pesados o no. Internamente use listas de adyacencia para representar las aristas del grafo. Ej.:
Todas las operaciones que realice su grafo deben estar aseguradas con pruebas unitarias de software. Las siguientes son operaciones básicas de un grafo (adaptado de Wikipedia):
Method | Description |
---|---|
|
Returns true if graph is empty. |
|
Tests whether there is an edge from the vertex |
|
Returns all vertices y such that there is an edge from the vertex |
|
Adds the vertex |
|
Removes the vertex |
|
Adds the edge from the vertex |
|
Removes the edge from the vertex |
|
Returns the value associated with the edge (x, y). |
|
Sets the value associated with the edge (x, y) to v. |
|
Returns the value associated with the edge (x, y) in both, read-only and read-write mode. |
En su implementación puede usar los sinónimos node
o point
en lugar de vertex
, y los sinónimos link
, line
, o arc
en lugar de edge
. Los grafos deben poder copiarse entre sí aunque sean de diferente naturaleza, y cuidar el buen uso de la memoria pricipal. Los grafos deben poderse imprimir a la salida estándar y exportarse a archivos de imagen.
2. Aplicación en línea de comandos
Implemente una aplicación en línea de comandos que permita crear grafos, agregarles nodos, establecer vértices con sus pesos, y realizar consultas sobre el grafo. Ejemplo de ejecución:
Entrada | Salida esperada |
---|---|
digraph G char ushort vertex G a b s d edge G a b 4 edge G a c 9 print G vertex G c ~vertex G s edge G a c 9 print G edge G b c 3 edge G c b 2 edge G c d 6 edge G d d 1 print G path G a d path G a d Ga_d.svg print G G.svg graph H int assign G to H ~vertex G c ~edge G c b print G erase G c print G print H |
error: invalid vertex c digraph G { a -> b [label="4"]; b; s; d; } digraph G { a -> b [label="4"]; a -> c [label="9"]; c; d; } digraph G { a -> b [label="4"]; a -> c [label="9"]; b -> c [label="3"]; c -> b [label="2"]; c -> d [label="6"]; d -> d [label="1"]; } a b c d: 14 digraph G { a -> b [label="4"]; a -> c [label="9"]; b -> c [label="3"]; c -> d [label="6"]; d -> d [label="1"]; } error: could not remove edge c, it has edges digraph G { a -> b [label="4"]; d -> d [label="1"]; } graph H { 97 -- 98 [label="4"]; 97 -- 99 [label="9"]; 98 -- 99 [label="5"]; 99 -- 100 [label="6"]; 100 -- 100 [label="1"]; } |
Instrucción | Descripción |
---|---|
|
Crea un grafo no dirigido con el nombre |
|
Crea un grafo dirigido con el nombre |
|
Elimina el grafo con nombre |
|
Agrega la lista de vértices (separados por espacios en blanco) al grafo con nombre |
|
Elimina los vértices indicados en la lista (separados por espacios en blanco) del grafo con nombre |
|
Elimina los vértices indicados en la lista (separados por espacios en blanco) del grafo con nombre |
|
Agrega una arista desde el vértice |
|
Elimina la arista desde el vértice |
|
Imprime el grafo con nombre |
|
Encuentra el camino más corto desde el vértice |
|
Copia el grafo con nombre |
Tipos de datos permitidos para los vértices y las aristas:
bool char uchar short ushort int uint long ulong longlong ulonglong float double ldouble
3. Evaluación
En todos los rubros de implementación se evaluará la convención de estilos (cpplint
), la documentación de interfaces (Doxygen), la documentación de implementaciones (comentarios dentro de subrutinas), la modularización del código, la reutilización de código, y la eficiencia del código.
-
[5%] Repositorio de control de versiones.
.gitignore
. Estructura de directorios de un proyecto (bin/
,build/
). Facilitar la construcción de la solución (ej.:Makefile
). -
[5%] Documento de análisis (
readme.md
oreadme.adoc
). -
[10%] Plantilla para generar clases grafo. Representa vértices con arreglo asociativo. Representa aristas con lista de adyacencia. Los tipos de datos para los vértices y las aristas son arbitrarios y podrían ser distintos. El grafo es dinámico, por lo que se pueden agregar o eliminar nodos y aristas en el tiempo. Se puede crear un grafo con una capacidad inicial de nodos para incrementar la eficiencia. Regla de los cinco.
-
[25%] Implementa las operaciones básicas de un grafo (véase Tabla 1).
-
[20%] Aplicación (ejecutable) de pruebas unitarias para el grafo con un framework (GoogleTest). Todas las operaciones de la plantilla grafo deben tener su correspondiente procedimiento de pruebas.
-
[5%] Crea al menos dos casos de prueba de cada negra manuales por estudiante. Un caso con datos correctos. Otro caso con instrucciones incorrectas. Usa notación sugerida para compartir casos de prueba con el grupo.
-
[20%] Implementa el intérprete de instrucciones de la Tabla 2. Usa la plantilla de grafo.
-
[10%] Usa biblioteca de terceros para generar/exportar gráficos de los grafos (ej.: Graphviz).