Introducción
Dado un gráfico G no dirigido, podemos construir un gráfico L (G) (llamado gráfico lineal o gráfico conjugado) que representa las conexiones entre los bordes en G. Esto se hace creando un nuevo vértice en L (G) para cada borde en G y conectando estos vértices si los bordes que representan tienen un vértice en común.
Aquí hay un ejemplo de Wikipedia que muestra la construcción de un gráfico lineal (en verde).
Como otro ejemplo, tome este gráfico G con vértices A, B, C y D.
A
|
|
B---C---D---E
Creamos un nuevo vértice para cada borde en G. En este caso, el borde entre A y C está representado por un nuevo vértice llamado AC.
AC
BC CD DE
Y conecte los vértices cuando los bordes que representan tienen un vértice en común. En este caso, los bordes de A a C y de B a C tienen el vértice C en común, por lo que los vértices AC y BC están conectados.
AC
/ \
BC--CD--DE
Este nuevo gráfico es el gráfico lineal de G!
Ver Wikipedia para más información.
Desafío
Dada la lista de adyacencia para un gráfico G, su programa debe imprimir o devolver la lista de adyacencia para el gráfico lineal L (G). Este es el código de golf, por lo que gana la respuesta con la menor cantidad de bytes.
Entrada
Una lista de pares de cadenas que representan los bordes de G. Cada par describe los vértices que están conectados por ese borde.
- Se garantiza que cada par (X, Y) es único, lo que significa que la lista no contendrá (Y, X) o un segundo (X, Y).
Por ejemplo:
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")]
[("D","E"),("C","D"),("B","C"),("A","C")]
Salida
Una lista de pares de cadenas que representan los bordes de L (G). Cada par describe los vértices que están conectados por ese borde.
Cada par (X, Y) debe ser único, lo que significa que la lista no contendrá (Y, X) o un segundo (X, Y).
Para cualquier borde (X, Y) en G, el vértice que crea en L (G) debe llamarse XY (los nombres se concatenan juntos en el mismo orden en que se especifican en la entrada).
Por ejemplo:
[("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
[("DE","CD"),("CD","CB"),("CD","CA"),("BC","AB")]
Casos de prueba
[] -> []
[("0","1")] -> []
[("0","1"),("1","2")] -> [("01","12")]
[("a","b"),("b","c"),("c","a")] -> [("ab","bc"),("bc","ca"),("ca","ab")]
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")] -> [("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
[("1","23"),("23","4"),("12","3"),("3","4")]
, para la cual presumiblemente debería ser la salida[("123","234"),("123","34")]
, que no se puede interpretar correctamente. Creo que la única forma de solucionar esto es editar con la garantía de que la entrada nunca contendrá tales ambigüedades, pero si esta pregunta se hubiera publicado en el sandbox , habría sugerido que fuera menos prescriptivo sobre la denominación de vértices en la salida.