Upload
tranxuyen
View
222
Download
0
Embed Size (px)
Citation preview
10/05/2005
1
Tema 9: GRAFOSEstructuras de Datos y Algoritmos
Curso 2004/05
Grafos. EDA. Curso 2003/042
OBJETIVOS
zDefiniciones formales de grafo y conceptos relacionadosz Estructuras de datos para representar grafoszAlgoritmos para resolver diferentes variantes del
problema de encontrar el camino mínimo sobre un grafozAlgoritmos para resolver el problema de encontrar el
árbol de extensión de coste mínimo sobre un grafo
Grafos. EDA. Curso 2003/043
ÍNDICE
z 1. Introducciónz 2. Conceptos Básicosz 3. Implementaci ón de grafosz 4. Recorridos de grafosz 5. Búsqueda del camino con peso mínimo: algoritmo de
Dijkstraz 6. Otros problemas de caminos en GADyOrdenación topológicayBúsqueda de caminos mínimos
z 7. Problema de obtención de árboles de extensión sobre grafos no dirigidosyAlgoritmos de Prim y Kruskal
10/05/2005
2
Grafos. EDA. Curso 2003/044
BIBLIOGRAFÍA
Básica:z Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley, 2000.
y Capítulos 14 y 23
Otros:z T.H. Cormen, C.E. Leiserson, R.L. Rivest. Introduction to Algorithms.
MIT Press, 1990.y Capítulos 5 y 23.
z Aho A.V., Hopcroft J.E., Ullman J.E. Estructuras de datos y Algoritmos. Addison-Wesley, 1988. y Capítulos 6 y 7.
Grafos. EDA. Curso 2003/045
1. INTRODUCCIÓN
zUn grafo permite representar relaciones binariasrelaciones binarias entre los elementos de un conjunto.
18
30
23
2535
4921
39
25
Ejemplos:•Rutas de transporte•Envío de correo electrónico
Grafos. EDA. Curso 2003/046
CONCEPTOS BÁSICOS
z Grafos dirigidos y no dirigidosz Grafos etiquetadosz Relaciones de incidencia y adyacenciaz Caminosz Subgrafosz ConectividadzÁrboles y Grafos
10/05/2005
3
Grafos. EDA. Curso 2003/047
Grafos Dirigidos (DiGrafos )
zUn grafo dirigidografo dirigido (g.d.) es un par G=(V,E)yV es un conjunto finito de vértices (nodos)yE es un conjunto de arcos (o aristas). Un arco es un par
ordenado(u,v) con u,v∈V
1 2 3
5 64
V={1,2,3,4,5,6}
E={(1,2),(2,2),(2,4),(2,5),(4,1), (4,5),(5,4),(6,3)}
Grafos. EDA. Curso 2003/048
zUn grafo no dirigidografo no dirigido (G.N.D) es un par G=(V,E)yV es un conjunto finito de vértices (nodos)yE es un conjunto de arcos (aristas). Un arco es un par NO
ordenado (u,v) con u,v∈V, u≠v
Grafos no dirigidos
V={1,2,3,4,5,6}
E={(1,2),(1,5),(2,5),(3,6)}
1 2 3
5 64
Grafos. EDA. Curso 2003/049
Grafos Etiquetados
zUn grafo etiquetado es un grafo G=(V,E) sobre el que se define una función f:E->A, dónde A es un conjunto cuyas componentes se llaman etiquetas.
zUn grafo ponderado (o con pesos o costes) es un grafo etiquetado con números reales (A≡ℜ)
10/05/2005
4
Grafos. EDA. Curso 2003/0410
Relaciones de Incidencia y Adyacencia
z Sea G=(V,E) un grafo dirigido. Si (u,v)∈E, decimos que incide desdeincide desde u (sale de..) e incide enincide en v (llega a..).Ejemplo: vértice 2
1 2 3
5 64
Grafos. EDA. Curso 2003/0411
Relaciones de Incidencia y Adyacencia (cont.)
z Sea G=(V,E) un grafo no dirigido. Si (u,v)∈E, decimos que incide sobreincide sobre u y v.
z Ejemplo: vértice 2
1 2 3
5 64
Grafos. EDA. Curso 2003/0412
Relaciones de Incidencia y Adyacencia (cont.)
z Sea G=(V,E) un grafo. Si (u,v)∈E, decimos que el vértice v es adyacenteadyacente al u.yLa relación es sim étrica en grafos no dirigidos
1 2 3
5 64
2 es adyacente a 11 es adyacente a 2
1 2 3
5 64
2 es adyacente a 11 NO es adyacente a 2
10/05/2005
5
Grafos. EDA. Curso 2003/0413
Relaciones de Incidencia y Adyacencia (cont.)
z Llamaremos grado de un vgrado de un véérticertice en un g.n.d. al nº de arcos que inciden sobre él.
1 2 3
5 64
El grado de 2 es 2
Grafos. EDA. Curso 2003/0414
Relaciones de Incidencia y Adyacencia (cont.)
z El grado de un vgrado de un véérticertice en un g.d. es el nº de arcos que salen de él (grado de salida) más el nº de arcos que entran (grado de entrada).
1 2 3
5 64
Grado de entrada del 2=2, Grado de salida del 2 =3Grado de 2=5
Grafos. EDA. Curso 2003/0415
Relaciones de Incidencia y Adyacencia (cont.)
z El grado de un grafo es el del vértice de máximo grado.
1 2 3
5 64
El grado de este grafo es 5
10/05/2005
6
Grafos. EDA. Curso 2003/0416
Caminos
zUn caminocamino de de longitud klongitud k desde desde uu a a uu’’ en un grafo G=(V,E)es una secuencia de vértices ⟨v0,v1,..,vk⟩ tal que vo=u y vk=u’y ∀i:1..k:(vi-1,vi)∈E. La longitud del camino es el número de arcos.
z La longitud del camino con pesos es la suma d elos costes de las aristas que forman el camino
z Si hay un camino P desde u hasta u’ , decimos que u’ es alcanzablealcanzable desde u via P.
Grafos. EDA. Curso 2003/0417
Caminos (cont.)
zUn caminocamino es simplesimple si todos sus vértices son distintos.
1 2 3
5 64
<1,2,5,4> es un camino simple de longitud 3
<2,5,4,5> no es un camino simple
Grafos. EDA. Curso 2003/0418
Caminos (cont.)
z En un g.d. un camino <v0,v1,..,vk> forma un ciclociclo si v0=vk yel camino contiene al menos un arco. yEl ciclo es simple si los vértices son distintosyUn bucle es un ciclo de longitud 1
1 2 3
5 64
<1,2,5,4,1> es un ciclo
10/05/2005
7
Grafos. EDA. Curso 2003/0419
Caminos (cont.)
z En un g.n.d. un camino <v0,v1,..,vk> forma un ciclociclo si v0=vk y los vi son distintos.
zUn grafo sin ciclos diremos que es acacííclicoclico (GDA)(GDA)
Grafos. EDA. Curso 2003/0420
Ejercicio
z Sea G = (V,E) un Grafo dirigido con pesosV={v0,v1, v2, v3, v4, v6, v6 }, E={ (v0, v1, 2), (v0, v3, 1), ( v1,v3, 3), (v1, v4, 10),
(v3,v4 , 2), (v3, v6, 4), ( v3,v5, 8), (v3, v2, 2), (v2,v0 , 4), (v2, v5, 5), ( v4,v6, 6), (v6, v5, 1) }
Se pide: 1.- |V| y |E|2.- Vértices adyacentes a cada v i
3.- Grado de cada vi y del Grafo 4.- Caminos desde v0 al resto de V értices, su longitud y su longitud con pesos 5.- Vértices alcanzables desde v 0
6.- Caminos mínimos desde v 0 al resto de Vértices 7.- ¿Tiene ciclos?
Grafos. EDA. Curso 2003/0421
Solución del ejercicio
4.- Caminos desde v 0 al resto de Vértices, su longitud y su longitud con pesos
Camino desde v0 a v0 : no hay → longitud 0Camino desde v0 a v 1 : ⟨ v0,v1⟩ , de longitud 1Caminos desde v0 a v2 : ⟨ v0,v1,v3,v2⟩ de longitud 3
⟨ v0,v3,v2⟩ de longitud 2Caminos desde v0 a v4 : ⟨ v0,v1,v4⟩ de longitud 2
⟨ v0,v3,v4⟩ de longitud 2⟨ v0,v1,v3,v4⟩ de longitud 3
⟨ v0,v3,v2,v0, ....⟩ de longitud ……
...
v0 v1
v2 v3 v4
v5 v6
2
4
1
101 3
2 24865
10/05/2005
8
Grafos. EDA. Curso 2003/0422
Subgrafos
zUn grafo G’=(V’,E’ ) es un subgrafo de G=(V,E) si V’⊆V y E’⊆E.
zDado un conjunto V’⊆V, el subgrafo de G inducido por V’es G’=(V ’,E’):E’={(u,v)∈E:u,v∈V’}
1 2 3
6
Ejemplo: subgrafo inducido por {1,2,3,6}
1 2 3
5 64
Grafos. EDA. Curso 2003/0423
Conectividad de un grafo
zUn g.n.d. es conexoconexo si cualquier par de vértices están conectados por un camino. Las componentes conexascomponentes conexas de un grafo son las clases de equivalencia en V definidas por la relaci ón “es alcanzable desde..”
1 2 3
5 64
Grafos. EDA. Curso 2003/0424
Conectividad de un grafo (cont.)
zUn g.d. es fuertemente conexofuertemente conexo si cualquier vértice es alcanzable desde cualquier otro. Las componentes componentes fuertemente conexasfuertemente conexas de un grafo son las clases de equivalencia en V definidas por la relaci ón “son mutuamente alcanzables”
1 2 3
5 64
10/05/2005
9
Grafos. EDA. Curso 2003/0425
Árboles
zUn bosquebosque es un grafo acíclico no dirigido.zUn grafo acíclico, no dirigido y conexo es un áárbol rbol (libre)(libre).
(a) Árbol (b) Bosque (c) Grafo
Grafos. EDA. Curso 2003/0426
Árboles
z Teorema: Sea G=(V,E) un g.n.d. Las siguientes afirmaciones son equivalentes:yG es un árbol (libre)yCualquier par de vértices en G están conectados por un único
camino simpleyG es conexo y |E|=|V|-1yG es acíclico pero si añadimos un arco a E, el grafo resultante
contiene un ciclo
Dem. Pág. 91-93 [Cormen,90]
Grafos. EDA. Curso 2003/0427
Árboles con raíz
zUn ÁÁrbol con rarbol con raíízz es un árbol con un vértice distinguido denominado raíz.
7
3 10 4
128 211
56 1
9
10/05/2005
10
Grafos. EDA. Curso 2003/0428
Árbol de recubrimiento de un gnd
zUn árbol de recubrimiento del grafo G=(V,E) es un árbol libre T=(V’ ,E’) tal que V’=V y E’ ⊆E
z Ejemplo:
a
h
b dc
e
g
i
f
48 7
914
10
478
112 Peso total=37
Grafos. EDA. Curso 2003/0429
2. REPRESENTACIÓN DE GRAFOS
zz Listas de AdyacenciaListas de Adyacencia: Un grafo G=(V,E) se representa como un vector de listas de vértices indexado por vértices. G[v] es una lista de los v értices emergentes y/o incidentes de/a v∈V.yMemoria: O(|V|+|E|)yTiempo de acceso: O(Grado(G))
zzMatriz de AdyacenciasMatriz de Adyacencias: Un grafo G=(V,E) se representa como una matriz indexada por vértices de booleanos. La componente G[u,v] es true si (u,v)∈E, sino G[u,v]=false.yMemoria: O(|V| 2)yTiempo de acceso: O(1)
Grafos. EDA. Curso 2003/0430
Ejemplos
10/05/2005
11
Grafos. EDA. Curso 2003/0431
Implementación de grafos
z Basada en listas de adyacencia:yImplementación básica:⌧Grafos sin pesos⌧Vértices numerados desde 0 hasta |V|-1
yImplementación de grafos ponderados⌧La clase Arista
yLos vértices no están numerados desde 0 hasta |V| -1⌧Utilización de un diccionario (tabla hash)⌧La clase Vertice
Grafos. EDA. Curso 2003/0432
Implementación básicapublic class Grafo {private Lista tabla [];private int numVertices;public Grafo(int N) {
numVertices=N; tabla=new LEIListaConPI[N];// o directamente tabla=new NodoLista [N];}public void insArista (int orig, int dest) {
if (tabla[orig]==null) tabla[orig]=new LEIListaConPI();tabla[orig].insertar(new Integer(dest));// o con NodoListas, si no interesa el orden directamente:// tabla[orig]=new NodoLista(new Integer(dest), tabla[orig]);// ejercicio: NodoListas y orden entre las aristas
}public String toString() {
String s="";for (int i=0; i<numVertices; i++)if (tabla[i]!=null) s+="Or:"+i+"Ady="+tabla[i].toString()+"\n";
return s;}
}
Grafos. EDA. Curso 2003/0433
Programa de pruebapublic class pruebaGrafo {
public static void main (String args[]) {BufferedReader in=new BufferedReader(newInputStreamReader(System.in));System.out.println("Escribe pares de vértices separados por blancos:");Grafo GM;
try {String linea=in.readLine();while (linea.length()!=0){
StringTokenizer st=new StringTokenizer(linea);int N=Integer.parseInt(st.nextToken());GM=new Grafo(N);int orig=Integer.parseInt(st.nextToken());int dest=Integer.parseInt(st.nextToken());GM.insArista(orig,dest);linea=in.readLine();
} }catch (IOException e) {}System.out.println("Grafo leído:");System.out.println(GM.toString());}
}
10/05/2005
12
Grafos. EDA. Curso 2003/0434
Ejemplo de ejecuci ón
Escribe pares de vértices separados por blancos:
1 21 42 53 53 64 25 46 6
Grafo leído:
Orig:1 Ady= 4 2Orig:2 Ady= 5Orig:3 Ady= 6 5Orig:4 Ady= 2Orig:5 Ady= 4Orig:6 Ady= 6
Grafos. EDA. Curso 2003/0435
Ejercicio (casa)
zDefinir los siguientes métodos en la clase Grafo:yMétodo constructor para crear el grafo a partir de la información
de arcos leída desde un ficheroyMétodo para consultar el número total de arcos de un grafoyMétodo para consultar el grado de un vértice dado (grado de
salida si el grafo es dirigido)yMétodo para consultar el grado del grafo (grado de salida si el
grafo es dirigido)yMétodo para comprobar si el grafo está vacíoyMétodo para comprobar si un determinado arco pertenece al
grafo
Grafos. EDA. Curso 2003/0436
Implementación de un grafo ponderado
public class Grafo {private Lista tabla [];private int numVertices;public Grafo(int N) {
numVertices=N; tabla=new LEIListaConPI[N];}public void insArista (int orig, int dest, int coste) {
if (tabla[orig]==null) tabla[orig]=new LEIListaConPI();tabla[orig].insertar(new Arista(dest,coste));// mismos comentarios si se decide usar directamente // NodosLista
}public String toString() {
String s="";for (int i=0; i<numVertices; i++)if (tabla[i]!=null) s+="Or:"+i+"Ady="+tabla[i].toString()+"\n";
return s;}
}
10/05/2005
13
Grafos. EDA. Curso 2003/0437
La clase Arista
public class Arista {
// atributos: el vértice destino y el coste del arcoprivate int dest;private int coste;
public Arista(int v, int c) {dest=v;coste=c;
}
public String toString(){return dest+“ ("+coste+")";
}
}
Grafos. EDA. Curso 2003/0438
Implementación de grafos en Java
z La clase Grafoz La clase Aristaz La clase Vértice
GrafoEs un
vector de... Vértices
Tiene una
lista de...
Aristas
Grafos. EDA. Curso 2003/0439
Ejemplo:D C 10A B 12D B 23A D 87E D 43B E 11C A 19
Los nombres de los vértices...
z En general, los vértices tendrán nombres asociados, típicamente cadenas de caracteres:ySe mantendrá una tabla hash con la codificación de cada vérticeyLos códigos se asignan internamente con valores entre 0 y el
número de v értices menos 1, conforme se va leyendo el grafo
D
C
A
B
E
0
1
2
3
4
DICCIONARIO
10/05/2005
14
Grafos. EDA. Curso 2003/0440
La implementación del diccionario
class ElementoHash implements Hashable {
String nombre;
int codigo;
public ElementoHash (String nom) {nombre=nom;
}public int hash () {
return ExploracionTablaCuadratica.hash(nombre);}public boolean equals (Object x) {
return nombre.equals( ((ElementoHash)x).nombre );}
}
Grafos. EDA. Curso 2003/0441
La clase Vertice
public class Vertice {String nombre; //el nombre del vérticeLista ady; // la lista de vértices adyacentes (aristas)
public Vertice(String v) {nombre=v;ady=new Lista();
}
public String toString() {return ady.toString();
}}
Grafos. EDA. Curso 2003/0442
La clase Grafo
public class Grafo {
private Vertice tabla [];private int numVertices;private TablaHash diccio;
public Grafo(int N) { ... }
public insArista (String orig,String dest,int cost) { ... }
public String toString() { ... }
}
10/05/2005
15
Grafos. EDA. Curso 2003/0443
El método constructor de Grafo
public Grafo() {numVertices=0;
tabla=new Vertice[TAMANYO_INICIAL];
diccio=new ExploracionTablaCuadratica();}
Grafos. EDA. Curso 2003/0444
La operaci ón insArista
public void insArista (String orig, String dest, int cost) {int codOrig=insNodo(orig);
int codDest=insNodo(dest);
LEIListaConPI aux=tabla[codOrig].ady;
aux.insertar(new Arista(codDest,cost));}
Grafos. EDA. Curso 2003/0445
La codificación de los vértices
private int insNodo (String nomVertice) {ElementoHash aux = new ElementoHash(nomVertice);ElementoHash res;
try {res= (ElementoHash) diccio.buscar(aux);return res.codigo; //Si ya está en el diccionario devolvemos su código
}catch (ElementoNoEncontrado e) {// Si no está, la añadimos al diccionario e incrementamos numVertices// Si fuera necesario se duplica la tabla de vérticesaux.codigo=numVertices;
diccio.insertar(aux);if (numVertices==tabla.length)
duplicarvectorTabla();tabla[numVertices]=new Vertice(aux.nombre);return numVertices++;
}}
10/05/2005
16
Grafos. EDA. Curso 2003/0446
4 Algoritmos de recorrido de grafos
zDFS: recorrido en profundidad (Depth First Search), generalización del recorrido en preorden de un árbol.
z BFS: recorrido en anchura (Breath First Search), generalización del recorrido por niveles de un árbol.
Grafos. EDA. Curso 2003/0447
Recorrido en profundidad (DFS)
z Explora sistemáticamente las aristas del grafo de forma que primero se visitan los v értices adyacentes a los visitados más recientemente. Así se va “profundizando” en el grafo.
z Algoritmo de recorrido en profundidad:y Contador ( ordenRecorrido)y Vector de naturales (R) para “ marcar” los vértices ya visitados (R[v]>0) y
almacenar el orden de recorrido. R[v]: orden en el que se visita el vértice v.
Grafos. EDA. Curso 2003/0448
Algoritmo de Recorrido en profundidad
Recorrido en ProfundidadordenRecorido=0; ∀v∈V: R[v]=0; ∀v∈V: Si (R[v]==0) entonces DFS(v) R mantiene el orden de recorrido
finRP
Método privado recursivoDFS(v)
ordenRecorrido++; R[v]=ordenRecorrido;∀w∈Adyacentes(v): Si (R[w]==0) entonces DFS(w)
10/05/2005
17
Grafos. EDA. Curso 2003/0449
Ejemplo: Recorrido DFS
27
3
1
5
4
9
8
6
Nodos Rv/w 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 01/2,3,4,5 1 - - - - - - - -
2 - 2 - - - - - - -3/2,6,8 - - 3 - - - - - -
6/7 - - - - - 4 - - - 7/2 - - - - - - 5 - -8/6 - - - - - - - 6 -
4/3,8 - - - 7 - - - - -5/- - - - - 8 - - - -
9/5,8 - - - - - - - - 9R 1 2 3 7 8 4 5 6 9
Grafos. EDA. Curso 2003/0450
Recorrido en profundidad en Java
int R[];int OrdenRecorrido;public void RecorridoEnProfundidad () {
R=new int[numVertices];OrdenRecorrido=1;for (int i=0;i<numVertices;i++) R[i]=0;for (int i=0; i<numVertices; i++) if (R[i]==0) DFS(i);
} private void DFS (int i) {
LEIListaConPI b=tabla[i]. ady;R[i]=OrdenRecorrido++;b.inicio();b.recuperar();while (!b.esFin()) {
Arista w=(Arista) b.recuperar();if (r[w.dest]==0) DFS(w.dest);b.siguiente();
}}
Grafos. EDA. Curso 2003/0451
Ejercicio:
zHacer una traza del recorrido en profundidad sobre el grafo siguiente:
⌧V0 V1⌧V0 V3⌧V1 V3⌧V1 V4⌧V2 V0⌧V2 V5⌧V3 V4⌧V3 V5⌧V3 V6⌧V4 V6⌧V6 V5
10/05/2005
18
Grafos. EDA. Curso 2003/0452
Recorrido en anchura (BFS)
z Explora sistemáticamente las aristas del grafo de forma que primero se visitan los v értices más “cercanos” al que estamos explorando.
z Algoritmo de recorrido en anchura:y Contador (OrdenRecorrido)y Vector de naturales (R) para “ marcar” los vértices ya visitados (R[v]>0) y
almacenar el orden de recorrido.y Cola (Q) para gestionar los vértices no visitados
Grafos. EDA. Curso 2003/0453
Algoritmo de Recorrido en anchura
Recorrido en AmplitudOrdenRecorrido=0; ∀ v∈V: R[v]=0; Q=new ColaEnlazada ();∀v∈V: Si R[v]==0 entonces BFS(v) R mantiene el orden de recorrido
Método privado para el recorrido en AmplitudBFS(v)
OrdenRecorrido++; R[v]=OrdenRecorrido;Q.encolar(v);mientras (!Q.esVacia()) {
u=Q.desencolar();∀w∈Adyacentes(u): Si R[w]==0 {
OrdenRecorrido++; R[w]=OrdenRecorrido; Q.encolar(w) }
finBFS
Grafos. EDA. Curso 2003/0454
Ejemplo: Recorrido BFS
27
3
1
5
4
9
8
6
Nodos R Qv u w 1 2 3 4 5 6 7 8 9
1 1 0 0 0 0 0 0 0 0 <1>1 - - - - - - - - - <>
2 - 2 - - - - - - - <2>3 - - 3 - - - - - - <2,3>4 - - - 4 - - - - - <2,3,4>5 - - - - 5 - - - - <2,3,4,5>
2 - - - - - - - - - <3,4,5>3 - - - - - - - - - <4,5>
2 - - - - - - - - - --6 - - - - - 6 - - - <4,5,6>8 - - - - - - - 7 - <4,5,6,8>
4 - - - - - - - - - <5,6,8>3 - - - - - - - - - --8 - - - - - - - - - --
5 - - - - - - - - - <6,8>6 - - - - - - - - - <8>
7 - - - - - - 8 - - <8,7>8 - - - - - - - - - <7>
6 - - - - - - - - - --7 - - - - - - - - - <>
9 - - - - - - - - 9 <9>9 - - - - - - - - - <>
5 - - - - - - - - - --8 - - - - - - - - - --
R 1 2 3 4 5 6 8 7 9
10/05/2005
19
Grafos. EDA. Curso 2003/0455
2.5 Orden topológico en grafos dirigidos acíclicos
z En un grafo dirigido acíclico el recorrido en profundidad puede utilizarse directamente para ordenar los v értices según un orden (parcial) “p “ tal que u,v∈V, si (u,v)∈E, upv. Basta ir anotando en una pila global (P) los vértices completamente explorados por DFS.
Grafos. EDA. Curso 2003/0456
Algoritmo de Ordenación Topológica
OTP(G)n:=0; ∀v∈V: Rv:=0; fin∀; creap(P);∀v∈V: Si Rv=0 entonces DFS(v) fin∀devolver (R)
finRP
DFS(v)n:=n+1; Rv:=n;∀w∈Adyacentes(v): Si Rw=0 entonces DFS(w) fin∀;apilar(P,v)
finDFS
Grafos. EDA. Curso 2003/0457
Ejemplo: Ordenación topológica
27
3
1
5
4
9
8
6
Nodos R Pv/w 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 <>1/2,3,4,5 1 - - - - - - - - <>
2 - 2 - - - - - - - <2>3/2,6,8 - - 3 - - - - - - <2>
6/7 - - - - - 4 - - - <2> 7/2 - - - - - - 5 - - <7,2>
--- - - - - - - - - - <6,7,2>8/6 - - - - - - - 6 - <8,6,7,2>
--- - - - - - - - - - <3,8,6,7,2>4/3,8 - - - 7 - - - - - <4,3,8,6,7,2>5/- - - - - 8 - - - - <5,4,3,8,6,7,2>
--- - - - - - - - - - <1,5,4,3,8,6,7,2>9/5,8 - - - - - - - - 9 <9,1,5,4,3,8,6,7,2>
9 1 5 4 3 8 6 7 2 Grafo ordenado topológicamente