Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Laboratorio 10
Laboratorio 10
INFORME DE LABORATORIO
INFORMACIÓN BÁSICA
ASIGNATURA: Análisis y Diseño de Algoritmos
TITULO DE LA
Algoritmos para grafos: Accesibilidad
PRÁCTICA:
NÚMERO DE NRO.
10 AÑO LECTIVO: 2023 B
PRÁCTICA: SEMESTRE:
FECHA DE HORA DE
30/11/2023 23:59
PRESENTACIÓN PRESENTACIÓN
INTEGRANTE (s)
Gabriel Llerena Morón NOTA (0-20)
Jorge Escobedo Ocaña
DOCENTE(s):
René Nieto
RESULTADOS Y PRUEBAS
I. EJERCICIOS RESUELTOS:
1. Permutación de vecinos. Repite los ejemplos C y D anteriores suponiendo que el grafo G está
representado por las siguientes listas de adyacencia:
0: 2 3 4
1:
2: 1 4
3: 4 5
4: 1 5
5: 1
Para decidir si el vértice 5 está al alcance del vértice 0, invocamos la función GRAPHreach() con
argumentos (G,0,5). Cada fila de la tabla siguiente registra el momento en que un arco es
recorrido. A continuación, registra la correspondiente invocación de reachR():
0 reachR(G, 0) 1-----
El estado final del vector visited[] muestra que todos los vértices están al alcance de 0.
2 reachR(G, 2) --1---
En este estado final, podemos observar que los vértices alcanzables desde el vértice 2 son 1, 4 y 5,
pero el vértice 3 no está marcado. Por lo tanto, según esta ejecución, el vértice 3 no está al alcance
del vértice 2.
2. Versión ansiosa de la función. Escriba una variante de la función GRAPHreach() que se detenga
inmediatamente (y devuelva true) al descubrir que t está al alcance de s. (El código de reachR()
para esta variante es más complicado que el de la versión ansiosa discutida anteriormente). Para
hacer el ejercicio más interesante, imprime un camino de s a t antes de devolver true.
#include <iostream>
#include <vector>
#include <stack>
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA
visited[v] = 1;
path.push(v);
if (v == t) {
vector<int> pathVector(path.size());
while (!path.empty()) {
pathVector[index--] = path.top();
path.pop();
cout << "Camino de " << pathVector.front() << " a " << t << ": ";
return true;
if (visited[w] == 0) {
}
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA
return false;
int n = G.size();
stack<int> path;
int main() {
Graph G = {
{3, 4, 2},
{},
{1, 4},
{4, 5},
{1, 5},
{1}
};
int start = 0;
int target = 4;
// Imprimir resultado
if (result) {
cout << "El vértice " << target << " está al alcance del vértice " << start
<< ".\n";
} else {
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA
cout << "El vértice " << target << " no está al alcance del vértice " <<
start << ".\n";
}
return 0;
}
Ejecución:
[Running] cd "d:\Yo\Celeste\" && g++ Lab09.cpp -o Lab09 &&
"d:\Yo\Celeste\"Lab09
Camino de 0 a 4: 0 3 4
3. Vértice central y vértice popular. Esbozar un algoritmo que decida si un grafo G dado tiene un
vértice r con la siguiente propiedad: todos los vértices de G están al alcance de r. Esbozar un
algoritmo que decida si un grafo G dado tiene un vértice que está al alcance de todos los demás.
Vértice Central:
1. Para cada vértice v en el grafo, calcula la suma de las longitudes de los caminos más cortos
desde v a todos los demás vértices utilizando, por ejemplo, el algoritmo de Dijkstra.
2. Encuentra el vértice r que minimiza esta suma. Si hay más de un vértice que cumple con esto,
selecciona cualquier vértice de ellos.
3. Verifica si la suma calculada para r es finita y mayor que cero. Si es así, entonces r es un vértice
central.
Vértice Popular:
1. Para cada vértice v en el grafo, verifica si todos los demás vértices son alcanzables desde v.
Puedes hacer esto usando la función GRAPHreach que hemos discutido anteriormente.
2. Si encuentras un vértice r desde el cual todos los demás vértices son alcanzables, entonces r es
un vértice popular.
Pseudocódigo:
r_min = NULL
min_sum = INFINITO
---
CONCLUSIONES
Los conceptos de búsqueda en grafos, representación de grafos, algoritmos recursivos como DFS y
optimización con Dijkstra son fundamentales para comprender la estructura y conectividad en grafos.
La identificación de vértices centrales y populares proporciona una visión clave de la centralidad y
accesibilidad en un grafo, con aplicaciones directas en campos como redes sociales y logística. Estos
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA
conceptos subrayan la importancia de diseñar algoritmos eficientes para abordar problemas del
mundo real.
METODOLOGÍA DE TRABAJO
REFERENCIAS Y BIBLIOGRAFÍA