ALGORITMOS Y ESTRUCTURAS DE DATOS II Ingeniería Técnica en Informática de Gestión Ingeniería Técnica en Informática de Sistemas Ejercicios del Tema 4 Grafos Algoritmos sobre grafos 1. Escribe una función que devuelva cierto si un grafo es regular. Un grafo es regular si todos sus vértices tienen el mismo número de vértices adyacentes. 2. Dado un grafo implementado mediante una matriz de adyacencia, escribe una función predecesores(v: vértice): conjunto <vértice>. Se dice que w es predecesor del vértice v si existe un arco que tenga por origen w y por destino a v, es decir, el arco (w,v) pertenece al conjunto de arcos del grafo. 3. Dado un grafo dirigido y dos vértices, escribe una función que indique si existe un camino entre dichos vértices 4. Escribe un algoritmo que dado un grafo dirigido y dos vértices de este grafo escriba todos los caminos simples de un vértice a otro. 5. Escribe un algoritmo que visualice todos los ciclos de un grafo dirigido. 6. Dado un grafo implementado mediante listas simples de adyacencia, implementar dos métodos que devuelvan, respectivamente, el grado de entrada y de salida de un vértice v de dicho grafo. 7. Escribe un método que determine si un grafo implementado mediante una lista de adyacencias es completo. Un grafo completo es aquel que tiene un arco entre cualquier par de vértices. El que sigue es un ejemplo de grafo completo: v1 v2 v3 Procesamiento de grafos Recorridos – caminos mínimos – árbol de expansión mínimo 8. Dado el siguiente grafo: B G A F D H C E Suponiendo que los sucesores de un nodo siempre se obtienen en orden alfabético, se pide: (a) Definir las estructuras adecuadas para representar en memoria el tipo Grafo Dirigido mediante listas de adyacencia y listas múltiples de adyacencia. Representar dicho grafo según las estructuras definidas. (b) Realizar un seguimiento detallado de los recorridos en anchura y profundidad del grafo anterior partiendo del nodo D, explicando qué nodos se van cogiendo en cada paso y cómo se modifican las estructuras auxiliares que se necesitan para cada caso. 9. Dado el grafo siguiente: B D G A C J E V P Suponiendo que los sucesores de un nodo siempre se obtienen en orden alfabético, se pide: (a) Considerando la Lista de Adyancencia como estructura para representar en memoria el tipo Grafo Dirigido, implementar en lenguaje algorítmico la acción Antecesores, que devuelve en una lista los antecesores de un determinado vértice. (b) Realizar un seguimiento detallado de los recorridos en anchura y profundidad del grafo anterior partiendo del nodo D, explicando qué nodos se van cogiendo en cada paso y cómo se modifican las estructuras auxiliares que se necesitan para cada caso. 10. Dado el siguiente grafo dirigido: 4 5 V2 V4 V3 1 1 3 1 2 V5 2 V8 V1 2 3 1 3 7 V7 V6 Se pide: (a) Calcular, mediante el algoritmo de Dijkstra, el coste mínimo para alcanzar cualquier vértice a partir del vértice V1. (b) Suponiendo que se parte desde el vértice V1, realizar un seguimiento detallado del recorrido en anchura, explicando qué nodos se van cogiendo en cada paso y cómo van modificándose las estructuras auxiliares que se necesitan en cada recorrido. NOTA: Los sucesores de un nodo siempre se obtienen en orden alfanumérico. 11. En una determinada carrera de orientación, el objetivo es llegar al último puesto de control con la menor penalización posible. Supongamos que nuestra prueba posee 6 puestos de control, numerados del 1 al 6. La salida está situada en el puesto de control número 1 y la meta en el número 6. Para llegar a la meta no es necesario pasar por todos los puestos de control. La puntuación con la que se penaliza al deportista si camina desde un determinado puesto hacia otro viene determinada por la siguiente tabla: 1 2 3 4 5 6 1 2 20 3 75 2 4 60 30 40 3 100 5 6 25 200 20 25 El origen lo indica el eje vertical y el destino el eje horizontal, es decir, la penalización por caminar desde el puesto 2 al 5 es de 25 puntos, y por caminar desde el puesto 5 al 3, la penalización es de 40 puntos. La ausencia de puntos indica que no se puede caminar directamente desde el puesto i al puesto j. La organización desea saber quién va venciendo parcialmente en cada puesto. Para saberlo se pide: (a) Haciendo uso del algoritmo de Dijkstra, calcular cual es la puntuación mínima que debe llevar un participante para vencer en cada puesto. Deberá realizarse un seguimiento del desarrollo del algoritmo, para lo cual debe construirse una tabla donde se observe la evolución del vector solución de distancias que devuelve el algoritmo, así como el vértice seleecionado en cada paso. (b) ¿Cuál es la puntuación con la que se vencería en la prueba? (c) Para llevar un cierto control, cuando un participante llega a un puesto, se le pregunta de qué puesto viene. Para saber si la respuesta es cierta, proponer una acción en la que, dado un determinado puesto, devuelva desde qué puestos se puede llegar directamente hacia él. NOTA: suponemos que estamos implementando el grafo mediante una lista simple de adyacencia