pgr_contractionLinear
- Propuesto¶
pgr_contractionLinear
— Realiza la contracción del grafo y devuelve los vértices y aristas contraídos..
Disponibilidad
Versión 3.8.0
Nueva función propuesta.
Descripción¶
La contracción reduce el tamaño del grafo eliminando algunos de los vértices y aristas, también por ejemplo, podría agregar aristas que representan una secuencia de aristas originales disminuyendo el tiempo total y el espacio utilizados en los algoritmos de grafo.
Las características principales son:
El proceso se realiza sólo en aristas con costos positivos.
No devuelve el grafo contraído completo.
Solo se devuelven los cambios en el grafo.
Los valores devueltos incluyen:
Las nuevas aristas generadas por la contracción lineal.
Los vértices modificados por contracción sin salida.
Los valores devueltos se ordenan de la siguiente manera:
columna
id
ascendente cuando es un vértice modificado.columna
id
con números negativos descendentes cuando es una nueva arista.
Firmas¶
[directed, forbidden]
(type, id, contracted_vertices, source, target, cost)
- Ejemplo:
Contracción lineal en un grafo no dirigido.
SELECT * FROM pgr_contractionLinear(
'SELECT id, source, target, cost, reverse_cost FROM edges',
directed => false);
type | id | contracted_vertices | source | target | cost
------+----+---------------------+--------+--------+------
e | -1 | {3} | 1 | 7 | 2
e | -2 | {17} | 12 | 16 | 2
e | -3 | {15} | 10 | 16 | 2
(3 rows)
Los nodos verdes son lineales y no forman parte del grafo contraído.
Aristas adyacentes no forman parte del grafo contraído.
Las lineas verdes son aristas que pertenecen al grafo contraído.
![graph G {
splines=false;
3,15,17 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,2,4,5,6,7,8,9,10,11,12,13,14,16 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1:n -- 7:n [label="-1",fontsize=8,color=red];
12:s -- 17:sw -- 16:w [label="-2",fontsize=8,color=red];
10:n -- 15:nw -- 16:w [label="-3",fontsize=8,color=red];
5 -- 6 [label="1",fontsize=8]; 6 -- 10 [label="2",fontsize=8];
10 -- 15 [label="3",fontsize=8]; 6 -- 7 [label="4",fontsize=8];
10 -- 11 [label="5",fontsize=8]; 1 -- 3 [label="6",fontsize=8];
3 -- 7 [label="7",fontsize=8]; 7 -- 11 [label="8",fontsize=8];
11 -- 16 [label="9",fontsize=8]; 7 -- 8 [label="10",fontsize=8];
11 -- 12 [label="11",fontsize=8]; 8 -- 12 [label="12",fontsize=8];
12 -- 17 [label="13",fontsize=8]; 8 -- 9 [label="",fontsize=8];
16 -- 17 [label="15",fontsize=8]; 15 -- 16 [label="16",fontsize=8];
2 -- 4 [label="17",fontsize=8]; 13 -- 14 [label="18",fontsize=8];
1 [pos="0,2!"]; 2 [pos="0.5,3.5!"];
3 [pos="1,2!"]; 4 [pos="2,3.5!"];
5 [pos="2,0!"]; 6 [pos="2,1!"];
7 [pos="2,2!"]; 8 [pos="2,3!"];
9 [pos="2,4!"]; 10 [pos="3,1!"];
11 [pos="3,2!"]; 12 [pos="3,3!"];
13 [pos="3.5,2.3!"]; 14 [pos="3.5,4!"];
15 [pos="4,1!"]; 16 [pos="4,2!"];
17 [pos="4,3!"];
}](_images/graphviz-069192ad4349ef79e70153b36d4506142c52a931.png)
Parámetros¶
Parámetro |
Tipo |
Descripción |
---|---|---|
|
SQL de aristas descritas más adelante. |
|
Orden de contracciones |
|
Operaciones de contracción ordenadas.
|
Parámetros opcionales¶
Columna |
Tipo |
x Defecto |
Descripción |
---|---|---|---|
|
|
|
|
Parámetros opcionales de Contracción¶
Columna |
Tipo |
x Defecto |
Descripción |
---|---|---|---|
|
|
vacío |
Identificadores de vértices prohibidos para contracción. |
|
|
Número de veces que se realizarán las operaciones de contracción en el orden |
Consultas Internas¶
SQL aristas¶
Columna |
Tipo |
x Defecto |
Descripción |
---|---|---|---|
|
ENTEROS |
Identificador de la arista. |
|
|
ENTEROS |
Identificador del primer vértice de la arista. |
|
|
ENTEROS |
Identificador del segundo vértice de la arista. |
|
|
FLOTANTES |
Peso de la arista ( |
|
|
FLOTANTES |
-1 |
Peso de la arista (
|
Donde:
- ENTEROS:
SMALLINT
,INTEGER
,BIGINT
- FLOTANTES:
SMALLINT
,INTEGER
,BIGINT
,REAL
,FLOAT
Columnas de resultados¶
Regresa conjunto de (type, id, contracted_vertices, source, target, cost)
La función devuelve una sola fila. Las columnas de la fila son:
Columna |
Tipo |
Descripción |
---|---|---|
|
|
Valor = |
|
|
Un pseudo identificador de la arista.
|
|
|
Arreglo de identificadores de vértices contraídos. |
|
|
Identificador del vértice de origen de la arista actual. |
|
|
Identificador del vértice destino de la arista actual. |
|
|
Peso de la arista actual. |
Ejemplos Adicionales¶
Bordes lineales¶
Grafo no dirigido
A node connects two (or more) linear edges when
El número de vértices adyacentes es 2.
![graph G {
label = "Linear edges"
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 2 -- 3 -- 2;
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-c915ca43812bfb7afeeffd1d2f7e072f6593f696.png)
![graph G {
label = "Non linear edges"
4,5,6,7 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
4 -- 5 -- 6 -- 5; 5 --7;
4 [pos="0,0!"]; 5 [pos="1,0!"]; 6 [pos="2,0!"];
7 [pos="1,1!"];
}](_images/graphviz-80d04e0ac46c2ac58db33ed33833b8376ea87eef.png)
En el caso de un grafo dirigido, un nodo se considera lineal cuando
El número de vértices adyacentes es 2.
La linealidad es simétrica.
![digraph G {
label = "Linearity is symmetrical."
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -> 2 -> 3 -> 2 -> 1;
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-ec0146321e74ae314bab5090db3f7e72f2fa1f65.png)
![digraph G {
label = "Linearity is not symmetrical."
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -> 2 -> 3 -> 2;
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-93233ecad7b6cf2ed672bd846f53b9d50a980a50.png)
La linealidad no es simétrica¶
Grafo dirigido
Grafo cuando la linealidad no es simétrica.
![digraph G {
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -> 2 [label="1",fontsize=8];
2 -> 3 [label="3",fontsize=8];
3 -> 2 [label="4",fontsize=8];
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-2956b8517f0df69088225a55990846dbb9ae75e4.png)
When the graph is processed as a directed graph, linearity is not symmetrical, therefore the graph can not be contracted.
SELECT * FROM pgr_contractionLinear(
$$SELECT * FROM (VALUES
(1, 1, 2, 1, -1),
(2, 2, 3, 3, 4))
AS edges(id,source,target,cost,reverse_cost)$$,
directed => true);
type | id | contracted_vertices | source | target | cost
------+----+---------------------+--------+--------+------
(0 rows)
Grafo no dirigido
When the same graph is processed as an undirected graph, linearity is symmetrical, therefore the graph can be contracted.
![graph G {
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 2 [label="1",fontsize=8];
2 -- 3 [label="3",fontsize=8];
3 -- 2 [label="4",fontsize=8];
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-946e80eb77cb0529d96e6199cc314eac3c039ad6.png)
SELECT * FROM pgr_contractionLinear(
$$SELECT * FROM (VALUES
(1, 1, 2, 1, -1),
(2, 2, 3, 3, 4))
AS edges(id,source,target,cost,reverse_cost)$$,
directed => false);
type | id | contracted_vertices | source | target | cost
------+----+---------------------+--------+--------+------
e | -1 | {2} | 1 | 3 | 4
(1 row)
Las tres aristas pueden ser reemplazadas por una arista no dirigida
Arista
.Con costo:
.Vértices contraídos en la arista:
.
![graph G {
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 3 [label="4, {2}",fontsize=8;color=red];
1 [pos="0,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-d625f5035052b5ad79de074aa489048c0241ff78.png)
La linealidad es simétrica¶
Grafo dirigido
Grafo donde la linealidad es simétrica.
![digraph G {
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -> 2 [label="1",fontsize=8];
2 -> 1 [label="2",fontsize=8];
2 -> 3 [label="3",fontsize=8];
3 -> 2 [label="4",fontsize=8];
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-49002a1065b9c5bc7564f25175a447b0cccd5c80.png)
When the graph is processed as a directed graph, linearity is not symmetrical, therefore the graph can not be contracted.
SELECT * FROM pgr_contractionLinear(
$$SELECT * FROM (VALUES
(1, 1, 2, 1, 2),
(2, 2, 3, 3, 4))
AS edges(id,source,target,cost,reverse_cost)$$,
directed => true);
type | id | contracted_vertices | source | target | cost
------+----+---------------------+--------+--------+------
e | -1 | {2} | 1 | 3 | 4
e | -2 | {2} | 3 | 1 | 6
(2 rows)
Las cuatro aristas pueden ser reemplazadas con dos aristas dirigidas.
Arista
.Con costo:
.Vértices contraídos en la arista:
.
Arista
.Con costo:
.Vértices contraídos en la arista:
.
![digraph G {
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -> 3 [label="4, {2}",fontsize=8;color=red];
3 -> 1 [label="6, {2}",fontsize=8;color=red];
1 [pos="0,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-6f75bf8e66681aa20c069d3ead197ce9e62f267c.png)
Grafo no dirigido
When the same graph is processed as an undirected graph, linearity is symmetrical, therefore the graph can be contracted.
![graph G {
2 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 2 [label="1",fontsize=8];
2 -- 1 [label="2",fontsize=8];
2 -- 3 [label="3",fontsize=8];
3 -- 2 [label="4",fontsize=8];
1 [pos="0,2!"]; 2 [pos="1,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-4772c46a98d0df937b2ce4687655644d65810756.png)
SELECT * FROM pgr_contractionLinear(
$$SELECT * FROM (VALUES
(1, 1, 2, 1, 2),
(2, 2, 3, 3, 4))
AS edges(id,source,target,cost,reverse_cost)$$,
directed => false);
type | id | contracted_vertices | source | target | cost
------+----+---------------------+--------+--------+------
e | -1 | {2} | 1 | 3 | 4
(1 row)
Las cuatro aristas pueden ser reemplazadas con una arista no dirigida.
Arista
.Con costo:
.Vértices contraídos en la arista:
.
![graph G {
1,3 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 3 [label="4, {2}",fontsize=8;color=red];
1 [pos="0,2!"]; 3 [pos="2,2!"];
}](_images/graphviz-6bec6c1f2e220906e102c9d21ef8783219c7ec42.png)
Contracción lineal, paso a paso¶
La contracción lineal se detendrá hasta que no hayan más aristas lineales. Por ejemplo, en el siguiente grafo hay aristas lineales
![digraph G {
1, 2, 3, 4, G [fontsize=8;fixedsize=true;style=filled];
1, 2, 3, 4 [shape=circle];
1, 4 [color=deepskyblue];
2, 3 [color=green];
G [shape=tripleoctagon;width=1.5;color=deepskyblue;label = "Rest of the Graph"];
G -> {1, 4} [dir=none, weight=1, penwidth=3];
1 -> 2 [label="1";fontsize=8;fixedsize=true];
2 -> 3 [label="1";fontsize=8;fixedsize=true];
3 -> 4 [label="1";fontsize=8;fixedsize=true];
G [pos="1,1!"];
1 [pos="0,0!"]; 2 [pos="1,0!"]; 3 [pos="2,0!"]; 4 [pos="3,0!"];
}](_images/graphviz-6567892805665a7ce5981b1a08fc9041d392b59b.png)
Contrayendo el vértice
El vértice
se elimina del grafoLos aristas
y fueron eliminados del grafo.Se inserta una nuevo arista
y se representa con color rojo.
![digraph G {
1, 2, 4, G [fontsize=8;fixedsize=true;style=filled];
1, 2, 4 [shape=circle];
1, 4 [color=deepskyblue];
2 [color=green];
G [shape=tripleoctagon;width=1.5;color=deepskyblue;label = "Rest of the Graph"];
G -> {1, 4} [dir=none, weight=1, penwidth=3];
1 -> 2 [label="1";fontsize=8;fixedsize=true];
2 -> 4 [label="2, {3}";color=red;fontsize=8;fixedsize=true];
G [pos="1,1!"];
1 [pos="0,0!"]; 2 [pos="1,0!"]; 4 [pos="3,0!"];
}](_images/graphviz-9979db882d187d41972ef525a3409d772accfd18.png)
Contrayendo el vértice
El vértice
se elimina del grafoLos aristas
y son eliminados del grafo.Se inserta una nuevo arista
y se representa con color rojo.
![digraph G {
1, 4, G [fontsize=8;fixedsize=true;style=filled];
1, 4 [shape=circle];
1, 4 [color=deepskyblue];
G [shape=tripleoctagon;width=1.5;color=deepskyblue;label = "Rest of the Graph"];
G -> {1, 4} [dir=none, weight=1, penwidth=3];
1 -> 4 [label="3, {2,3}";color=red;fontsize=8;fixedsize=true]
G [pos="1,1!"];
1 [pos="0,0!"]; 4 [pos="3,0!"];
}](_images/graphviz-db2920cace480487d7d9f480027b6e67177e2663.png)
El arista
SELECT * FROM pgr_contractionLinear(
$$SELECT * FROM (VALUES
(1, 1, 2, 1),
(2, 2, 3, 1),
(2, 3, 4, 1))
AS edges(id,source,target,cost)$$);
type | id | contracted_vertices | source | target | cost
------+----+---------------------+--------+--------+------
e | -1 | {2,3} | 1 | 4 | 3
(1 row)
Creando el grafo contraído¶
Pasos para la creación del grafo contraído¶
Añadir columnas adicionales.
ALTER TABLE vertices ADD is_contracted BOOLEAN DEFAULT false;
ALTER TABLE
ALTER TABLE edges ADD is_new BOOLEAN DEFAULT false;
ALTER TABLE
ALTER TABLE edges ADD contracted_vertices BIGINT[];
ALTER TABLE
Almacenar los resultados en una tabla.
SELECT * INTO contraction_results
FROM pgr_contractionLinear(
'SELECT id, source, target, cost, reverse_cost FROM edges',
directed => false);
SELECT 3
Usar la columna is_contracted
para indicar los vértices contraídos.
UPDATE vertices
SET is_contracted = true
WHERE id IN (SELECT unnest(contracted_vertices) FROM contraction_results);
UPDATE 3
Los vértices contraído no forman parte del grafo contraído.
SELECT id, is_contracted
FROM vertices WHERE is_contracted ORDER BY id;
id | is_contracted
----+---------------
3 | t
15 | t
17 | t
(3 rows)
Inserte las nuevas aristas generadas por pgr_contraction.
INSERT INTO edges(source, target, cost, reverse_cost, contracted_vertices, is_new)
SELECT source, target, cost, -1, contracted_vertices, true
FROM contraction_results;
INSERT 0 3
Crear el grafo contraído.
CREATE VIEW contracted_graph AS
WITH
vertices_in_graph AS (
SELECT id FROM vertices WHERE NOT is_contracted
)
SELECT id, source, target, cost, reverse_cost
FROM edges
WHERE source IN (SELECT * FROM vertices_in_graph)
AND target IN (SELECT * FROM vertices_in_graph)
ORDER BY id;
CREATE VIEW
El grafo contraído¶
SELECT * FROM contracted_graph ORDER by id;
id | source | target | cost | reverse_cost
----+--------+--------+------+--------------
1 | 5 | 6 | 1 | 1
2 | 6 | 10 | -1 | 1
4 | 6 | 7 | 1 | 1
5 | 10 | 11 | 1 | -1
8 | 7 | 11 | 1 | 1
9 | 11 | 16 | 1 | 1
10 | 7 | 8 | 1 | 1
11 | 11 | 12 | 1 | -1
12 | 8 | 12 | 1 | -1
14 | 8 | 9 | 1 | 1
17 | 2 | 4 | 1 | 1
18 | 13 | 14 | 1 | 1
19 | 1 | 7 | 2 | -1
20 | 12 | 16 | 2 | -1
21 | 10 | 16 | 2 | -1
(15 rows)
![graph G {
splines=false;
1,2,4,5,6,7,8,9,10,11,12,13,14,16 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 7 [label="19, (2, {3})",fontsize=8];
12 -- 16 [label="20, (2, {17})",fontsize=8];
10 -- 16 [label="21, (2, {15})",fontsize=8];
5 -- 6 [label="1",fontsize=8]; 6 -- 10 [label="2",fontsize=8];
6 -- 7 [label="4",fontsize=8];
10 -- 11 [label="5",fontsize=8];
7 -- 11 [label="8",fontsize=8];
11 -- 16 [label="9",fontsize=8]; 7 -- 8 [label="10",fontsize=8];
11 -- 12 [label="11",fontsize=8]; 8 -- 12 [label="12",fontsize=8];
8 -- 9 [label="",fontsize=8];
2 -- 4 [label="17",fontsize=8]; 13 -- 14 [label="18",fontsize=8];
1 [pos="0,2!"]; 2 [pos="0.5,3.5!"];
4 [pos="2,3.5!"];
5 [pos="2,0!"]; 6 [pos="2,1!"];
7 [pos="2,2!"]; 8 [pos="2,3!"];
9 [pos="2,4!"]; 10 [pos="3,1!"];
11 [pos="3,2!"]; 12 [pos="3,3!"];
13 [pos="3.5,2.3!"]; 14 [pos="3.5,4!"];
16 [pos="4,2!"];
}](_images/graphviz-0539f2097024ee3664e745ed5dadc5882fc6bb36.png)
Usando cuando la salida como el destino pertenecen al grafo contraído¶
SELECT *
FROM pgr_dijkstra('SELECT * FROM contracted_graph', 7, 16);
seq | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 | 1 | 7 | 16 | 7 | 8 | 1 | 0
2 | 2 | 7 | 16 | 11 | 9 | 1 | 1
3 | 3 | 7 | 16 | 16 | -1 | 0 | 2
(3 rows)
![graph G {
splines=false;
1,2,4,5,6,7,8,9,10,11,12,13,14,16 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 7 [label="19, (2, {3})",fontsize=8];
12 -- 16 [label="20, (2, {17})",fontsize=8];
10 -- 16 [label="21, (2, {15})",fontsize=8];
5 -- 6 [label="1",fontsize=8]; 6 -- 10 [label="2",fontsize=8];
6 -- 7 [label="4",fontsize=8];
10 -- 11 [label="5",fontsize=8];
7 -- 11 [label="8",fontsize=8;color=red];
11 -- 16 [label="9",fontsize=8;color=red]; 7 -- 8 [label="10",fontsize=8];
11 -- 12 [label="11",fontsize=8]; 8 -- 12 [label="12",fontsize=8];
8 -- 9 [label="",fontsize=8];
2 -- 4 [label="17",fontsize=8]; 13 -- 14 [label="18",fontsize=8];
1 [pos="0,2!"]; 2 [pos="0.5,3.5!"];
4 [pos="2,3.5!"];
5 [pos="2,0!"]; 6 [pos="2,1!"];
7 [pos="2,2!"]; 8 [pos="2,3!"];
9 [pos="2,4!"]; 10 [pos="3,1!"];
11 [pos="3,2!"]; 12 [pos="3,3!"];
13 [pos="3.5,2.3!"]; 14 [pos="3.5,4!"];
16 [pos="4,2!"];
}](_images/graphviz-a3f31bc8a0a6461912a48c178829e7fd344a7244.png)
Usando cuando la salida /destino no pertenecen al grafo contraído¶
SELECT * FROM pgr_dijkstra(
'WITH in_line AS (SELECT contracted_vertices FROM edges WHERE 17 = ANY(contracted_vertices))
SELECT id, source, target, cost, reverse_cost
FROM edges, in_line
WHERE source = ANY(in_line.contracted_vertices) OR target = ANY(in_line.contracted_vertices)
UNION
SELECT id, source, target, cost, reverse_cost FROM contracted_graph',
1, 17);
seq | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 | 1 | 1 | 17 | 1 | 19 | 2 | 0
2 | 2 | 1 | 17 | 7 | 8 | 1 | 2
3 | 3 | 1 | 17 | 11 | 9 | 1 | 3
4 | 4 | 1 | 17 | 16 | 15 | 1 | 4
5 | 5 | 1 | 17 | 17 | -1 | 0 | 5
(5 rows)
![graph G {
17 [shape=circle;style=filled;color=lightgreen;fontsize=8;width=0.3;fixedsize=true];
1,2,4,5,6,7,8,9,10,11,12,13,14,16 [shape=circle;style=filled;color=cyan;fontsize=8;width=0.3;fixedsize=true];
1 -- 7 [label="19, (2, {3})",fontsize=8;color=red];
12 -- 16 [label="20, (2, {17})",fontsize=8];
10 -- 16 [label="21, (2, {15})",fontsize=8];
5 -- 6 [label="1",fontsize=8]; 6 -- 10 [label="2",fontsize=8];
6 -- 7 [label="4",fontsize=8];
10 -- 11 [label="5",fontsize=8];
7 -- 11 [label="8",fontsize=8;color=red]; 12 -- 17 [label="13",fontsize=8];
11 -- 16 [label="9",fontsize=8;color=red]; 7 -- 8 [label="10",fontsize=8];
11 -- 12 [label="11",fontsize=8]; 8 -- 12 [label="12",fontsize=8];
8 -- 9 [label="",fontsize=8]; 16 -- 17 [label="15",fontsize=8;color=red];
2 -- 4 [label="17",fontsize=8]; 13 -- 14 [label="18",fontsize=8];
1 [pos="0,2!"]; 2 [pos="0.5,3.5!"];
4 [pos="2,3.5!"];
5 [pos="2,0!"]; 6 [pos="2,1!"];
7 [pos="2,2!"]; 8 [pos="2,3!"];
9 [pos="2,4!"]; 10 [pos="3,1!"];
11 [pos="3,2!"]; 12 [pos="3,3!"];
13 [pos="3.5,2.3!"]; 14 [pos="3.5,4!"];
16 [pos="4,2!"]; 17 [pos="4,3!"];
}](_images/graphviz-083b6038b8df39caaf7f1ed454f2e4c2a8921297.png)
Ver también¶
Índices y tablas