CPSを使用していません...しかし、私はHaskellの平面グラフライブラリに取り組んでおり、上記で説明したものと同様のスキームを使用しています。エッジは、どの既存のエッジがその前または後に来るかを指定することによって追加されます。
実際のグラフの実装が完了しました。残っているのは、バイナリシリアル化を機能させてパフォーマンスを向上させることです(初心者にはPLANAR_CODEを使用し、おそらくGraph6とSparse6も使用します)。
現在、別の関数で双対グラフ(これも描画したようです)を取得しますが、エッジを追加するたびに双対グラフを計算することを検討しています(接続されたグラフを想定)。
コードは;から取得できます。サンプルの使用法(これは私がこのライブラリを開発しているものです)はにあります。darcs get http://code.haskell.org/~ivanm/planar-graph/
http://code.haskell.org/~ivanm/dangd/
使用例としてHaddockのドキュメントから引用:
たとえばg
、次のグラフを参照してみましょう(ここで
n1
、などはラベルと変数名の両方です)。
==== ====
( n1 ) ( n2 )
==== ====
====
( n3 )
====
n1
との間にエッジを追加できます(現在、どちらのノードにもエッジがないため、
EdgePosとしてAnywheren2
を使用します)。
((e1,e2),g') = addEdge n1 Anywhere n2 Anywhere "e1" "e2" g
これにより、次のグラフが作成されます。
e2
==== <--------------- ====
( n1 ) ( n2 )
==== ---------------> ====
e1
====
( n3 )
====
n2
との間にエッジを追加する場合は、次n3
の場所に3つのオプションがありますn2
。
使用Anywhere
:他のエッジは1つしかないため、2番目のエッジの埋め込みに関しては違いはありません。
新しいエッジを配置しますBeforeEdge e2
(時計回りに回りますn2
)。
新しいエッジを配置しますAfterEdge e2
(時計回りに回りますn2
)。
n2
現在、エッジは1つしかないため、3つのEdgePos値すべてが同じグラフになり、任意に1つを選択できます。
((e3,e4),g'') = addEdge n2 (BeforeEdge e2) n3 Anywhere "e3" "e4" g'
ただし、エッジが多い場合は、どのEdgePos
値を使用するかについて注意する必要があります。結果のグラフは次のとおりです。
e2
==== <--------------- ====
( n1 ) ( n2 )
==== ---------------> ====
e1 | ^
| |
e3 | | e4
| |
v |
====
( n3 )
====
同じグラフ(実際のエッジ値まで。したがって、それは満たされません
==
)は次のように取得されます。
((e4,e3), g'') = addEdge n3 Anywhere n2 (BeforeEdge e2) "e4" "e3" g'