Introdução
Dado um gráfico não direcionado G, podemos construir um gráfico L (G) (chamado gráfico de linhas ou gráfico conjugado) que representa as conexões entre as arestas em G. Isso é feito criando um novo vértice em L (G) para cada aresta em G e conectando esses vértices se as arestas que eles representam têm um vértice em comum.
Aqui está um exemplo da Wikipedia mostrando a construção de um gráfico de linhas (em verde).
Como outro exemplo, considere este gráfico G com os vértices A, B, C e D.
A
|
|
B---C---D---E
Criamos um novo vértice para cada aresta em G. Nesse caso, a aresta entre A e C é representada por um novo vértice chamado AC.
AC
BC CD DE
E conecte os vértices quando as arestas que eles representam têm um vértice em comum. Nesse caso, as arestas de A a C e de B a C têm o vértice C em comum; portanto, os vértices AC e BC são conectados.
AC
/ \
BC--CD--DE
Este novo gráfico é o gráfico de linhas do G!
Veja a Wikipedia para mais informações.
Desafio
Dada a lista de adjacência para um gráfico G, seu programa deve imprimir ou retornar a lista de adjacência para o gráfico de linha L (G). Isso é código-golfe, então a resposta com o menor número de bytes vence!
Entrada
Uma lista de pares de strings representando as arestas de G. Cada par descreve os vértices conectados por essa aresta.
- Cada par (X, Y) é garantido como único, o que significa que a lista não conterá (Y, X) ou um segundo (X, Y).
Por exemplo:
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")]
[("D","E"),("C","D"),("B","C"),("A","C")]
Resultado
Uma lista de pares de cadeias representando as arestas de L (G). Cada par descreve os vértices conectados por essa borda.
Cada par (X, Y) deve ser único, o que significa que a lista não conterá (Y, X) ou um segundo (X, Y).
Para qualquer aresta (X, Y) em G, o vértice criado em L (G) deve ser nomeado XY (os nomes são concatenados juntos na mesma ordem em que foram especificados na entrada).
Por exemplo:
[("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 teste
[] -> []
[("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 a qual a saída deva ser presumivelmente[("123","234"),("123","34")]
, que não possa ser corretamente interpretada. Eu acho que a única maneira de corrigir isso é editar, garantindo que a entrada nunca contenha essas ambiguidades, mas se essa pergunta tivesse sido postada na sandbox , eu sugeriria ser menos prescritivo sobre a nomeação de vértices na saída.