前書き
無向グラフGが与えられると、Gのエッジ間の接続を表すグラフL(G)(線グラフまたは共役グラフと呼ばれます)を構築できます。これは、 Gおよびそれらが表すエッジに共通の頂点がある場合、これらの頂点を接続します。
これは、折れ線グラフ(緑)の作成を示すWikipediaの例です。
別の例として、頂点A、B、C、およびDを持つこのグラフGを取り上げます。
A
|
|
B---C---D---E
Gの各エッジに新しい頂点を作成します。この場合、AとCの間のエッジはACと呼ばれる新しい頂点で表されます。
AC
BC CD DE
また、頂点が表すエッジに共通の頂点がある場合は、頂点を接続します。この場合、AからCへのエッジとBからCへのエッジは頂点Cが共通なので、頂点ACとBCが接続されます。
AC
/ \
BC--CD--DE
この新しいグラフは、Gの折れ線グラフです。
チャレンジ
グラフGの隣接リストが与えられた場合、プログラムは線グラフL(G)の隣接リストを出力または返す必要があります。これはコードゴルフなので、バイト数が最も少ない答えが勝ちます!
入力
Gのエッジを表す文字列のペアのリスト。各ペアは、そのエッジによって接続されている頂点を示します。
- 各ペア(X、Y)は一意であることが保証されています。つまり、リストには(Y、X)または2番目の(X、Y)は含まれません。
例えば:
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")]
[("D","E"),("C","D"),("B","C"),("A","C")]
出力
L(G)のエッジを表す文字列のペアのリスト。各ペアは、そのエッジによって接続されている頂点を表します。
各ペア(X、Y)は一意である必要があります。つまり、リストには(Y、X)または2番目の(X、Y)は含まれません。
Gのエッジ(X、Y)の場合、L(G)で作成される頂点の名前はXYにする必要があります(名前は、入力で指定されたのと同じ順序で連結されます)。
例えば:
[("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")]
テストケース
[] -> []
[("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")]
出力はおそらくであるはずですが[("123","234"),("123","34")]
、正しく解釈することはできません。これを修正する唯一の方法は、入力にそのようなあいまいさが含まれないように編集することですが、この質問がサンドボックスに投稿されていた場合、出力の頂点の命名について規範的ではないことをお勧めします。