2. RESÚMEN DEL ENUNCIADO
• DOS CIENTÍFICOS SON AFINES SI:
– FIGURAN COMO AUTORES DE UN MISMO
ARTÍCULO.
– EXISTE UNA SUCESIÓN DE CIENTÍFICOS Ci TAL QUE
(A Y C1), (C1 Y C2), … , (Cn-1 Y Cn), (Cn Y Z), ES
DECIR, FIGURAN COMO AUTORES DE UN MISMO
ARTÍCULO.
• HAY QUE DETERMINAR LOS CIENTÍFICOS (NO
REPETIDOS) AFINES A UNO DADO.
Francisco Garrido Carrasco
5. DE LOS TAD´S VISTOS HASTA AHORA,
EL QUE MEJOR SE CORRESPONDE CON
EL GRÁFICO ANTERIOR ES:
TAD GRAFO
Francisco Garrido Carrasco
6. Características del GRAFO
• Vértices: Representan a los científicos.
• Arcos: Representa la relación entre científicos,
es decir, si existe arco entre dos vértices
(científicos) han colaborado en el mismo
artículo.
Francisco Garrido Carrasco
7. Características GRAFO
• Grafo no dirigido:
– A afín B han colaborado en el mismo artículo.
OR
– Existe sucesión de científicos Ci / A - C1 - C2 - … - B
&&
– B afín A han colaborado en el mismo artículo.
OR
– Existe sucesión de científicos Ci / B - C1 - C2 - … - A
• El grafo permite ciclos.
Francisco Garrido Carrasco
8. Características del GRAFO
• Grafo no dirigido:
C2
C3
C1
ADY(C3, C4) = 1
&&
ADY(C4, C3) = 1
C4
C5
Francisco Garrido Carrasco
9. Características del GRAFO
EJEMPLO
A afín D && D afín A
A B C D B afín C && C afín B
B afín D && D afín B
A 0 0 0 1
B 0 0 1 1
C 0 1 0 0 A afín C && C afín A
D 1 1 0 0 A D B C
Francisco Garrido Carrasco
18. ALGORITMO
• DEBE SER ITERATIVO
• COSTE CUADRÁTICO
• DEBE DETERMINAR SI A Y Z SON AFINES
Francisco Garrido Carrasco
19. ALGORITMO
• DEBE SER ITERATIVO
• COSTE CUADRÁTICO
• DEBE DETERMINAR SI A Y Z SON AFINES
• DADO UN NÚMERO “n”, QUE DETERMINA EL
MÁXIMO NÚMERO DE CIENTÍFICOS
INTERMEDIOS QUE PUEDE HABER ENTRE A Y Z
Francisco Garrido Carrasco
20. ALGORITMO
• DEBE SER ITERATIVO
• COSTE CUADRÁTICO
• DEBE DETERMINAR SI A Y Z SON AFINES
• DADO UN NÚMERO “n”, QUE DETERMINA EL
MÁXIMO NÚMERO DE CIENTÍFICOS
INTERMEDIOS QUE PUEDE HABER ENTRE A Y Z
• “n” >= 0
Francisco Garrido Carrasco
21. ALGORITMO
EN REALIDAD MI PROBLEMA ES:
Comprobar si dos científicos son AFINES,
dado un número máximo de científicos
intermedios
TRADUCIDO A MI TAD GRAFO ES:
Comprobar si EXISTE CAMINO entre ellos y
que la longitud de este sea menor o igual
que un número dado
Francisco Garrido Carrasco
22. ALGORITMO
SOLUCIÓN
RECORRER EL GRAFO DESDE UN VÉRTICE
(CIENTÍFICO) DADO, INTENTANDO LLEGAR AL
OTRO VÉRTICE (CIENTÍFICO) DADO.
Francisco Garrido Carrasco
24. ALGORITMO
OPCIONES PARA RECORRER
Recorrido en anchura
Recorrido en profundidad
Recorrido topológico
Algoritmo MM
Algoritmo de Warshall
Algoritmo de Floyd
Algoritmo de Dijkstra
Algoritmo de Prim
Algoritmo de Kruskal
Francisco Garrido Carrasco
25. ALGORITMO
RECORRIDO EN ANCHURA
Complejidad: O(n2)
Recorrido iterativo
Válido para grafos no dirigidos
VALDRÍA
Francisco Garrido Carrasco
26. ALGORITMO
RECORRIDO EN PROFUNDIDAD
Complejidad: O(n2)
Puede ser recursivo e iterativo
Válido para grafos no dirigidos
VALDRÍA
Francisco Garrido Carrasco
27. ALGORITMO
RECORRIDO TOPOLÓGICO
Complejidad: O(n2)
Recorrido iterativo
PARA GRAFOS DIRIGIDOS Y SIN CICLO
¡ NO VALDRÍA !
Francisco Garrido Carrasco
30. ALGORITMO
ALGORITMO DE FLOYD
COMPLEJIDAD O(n3)
Recorrido iterativo
Grafos valuados
¡ NO VALDRÍA !
Francisco Garrido Carrasco
31. ALGORITMO
ALGORITMO DE DIJKSTRA
Complejidad O(n2)
Recorrido iterativo
Grafos valuados
¡ VALDRÍA !
PONIENDO A TODAS LAS ARISTAS PESO 1
Francisco Garrido Carrasco
32. ALGORITMO
ALGORITMO DE PRIM
Complejidad O(n2)
Recorrido iterativo
Grafos valuados
¡ PUEDE O NO VALER!
PERO NO TIENE POR QUÉ
PONIENDO A TODAS LAS ARISTAS PESO 1
Francisco Garrido Carrasco
33. ALGORITMO
ALGORITMO DE KRUSKAL
Complejidad O(n2)
Recorrido iterativo
Grafos valuados
¡ PUEDE O NO VALER!
PERO NO TIENE POR QUÉ
PONIENDO A TODAS LAS ARISTAS PESO 1
Francisco Garrido Carrasco
34. ALGORITMO
LOS VÁLIDOS SON
Recorrido en anchura
Recorrido en profundidad
Algoritmo de Dijkstra
Francisco Garrido Carrasco
35. ALGORITMO
UTILIZARÉ
Recorrido en anchura
Francisco Garrido Carrasco
36. void Anchura(Grafo G, TipoVertice v, CjtoVertices &Visitados){
CjtoVertices Ady;
TipoVertice w;
ALGORITMO
ColaTipoVertice C;
Visitados.Crear();
Visitados.Insertar(v);
RECORRIDO EN ANCHURA
C.Crear();
C.Insertar(v);
while(!C.Vacia()){
C.Primero(v);
C.Borrar();
//Tratamiento de v
Ady.Crear();
G.Adyacentes(v,Ady);
while(!Ady.Vacio()){
w = Ady.Elegir();
Ady.Borrar(w);
if(!Visitados.Pertenece(w)){
Visitados.Insertar(w);
C.Insertar(w);
}
}
}
} Francisco Garrido Carrasco
37. ALGORITMO
HAY QUE MODIFICAR ALGUNAS COSAS
• Añadir parámetros de entrada.
• Cada vértice será una estructura, compuesta por el valor
numérico del vértice y un contador, que determina la
distancia a la que se encuentra respecto del nodo de partida.
typedef struct Vertice{
int numeroVertice;
int contador;
};
• El algoritmo devolverá un tipo booleano.
Francisco Garrido Carrasco
41. ALGORITMO
MÁS FÁCIL
Algoritmo de Dijkstra
(Distancia mínima de un vértice al resto)
Francisco Garrido Carrasco
42. ALGORITMO
RESUMIENDO
– Algoritmo de Dijkstra
– Todos las aristas tienen peso 1
– Comprobar en la matriz el valor dado para el par de
vértices (científicos), los cuales estamos
comprobando su afinidad
Si (valor <= n) -> Existe camino -> Científicos afines
Si (valor > n) OR (valor == 0) -> Científicos no afines
Francisco Garrido Carrasco
43. ALGORITMO IMPLEMENTACIÓN
Procedimiento Dijkstra (ent G: grafo; ent v: vértice;
sal MenorCoste: vector[n] de etiqueta)
variables
Visitados: Cjto Vértices;
Inicio
Para todo w de G.Vertices() hacer
MenorCoste[w] = etiqueta (G, v, w)
FinPara
MenorCoste[v] = 0; // no hace falta, ya vale 0
Visitados.Crear();
Visitados.Insertar(v);
mientras Visitados no contenga todos los vértices hacer
seleccionar w no pertenece Visitados t.q. MenorCoste[w] sea mínimo
Visitados.Insertar(w);
para todo u no pertenece Visitados hacer
MenorCoste[u] = mínimo (MenorCoste[u], MenorCoste[w]+etiqueta(G, u, w))
Francisco Garrido Carrasco
44. ALGORITMO IMPLEMENTACIÓN
Procedimiento Afines (ent G: grafo; ent v: vértice; ent v2: vértice) devuelve boolean
Variables
sal MenorCoste: vector[n] de etiqueta
Inicio
Dijkstra(G, v, menorCoste);
si ((MenorCoste[v2 - 1] == 0) OR (MenorCoste[v2 - 1] > n)) {
devuelve false;
}
sino{
devuelve true;
}
Fin
Francisco Garrido Carrasco