有向グラフと無向グラフの変換 #2
前掲のgvprプログラムではうまく変換できないDOTデータがあった。
$ gvpr -c "BEG_G { node($, 'tubeworm'); }" shiritori.gv | tee fellows.gv digraph kobutanukituneko { piglet -> "raccoon dog"; "raccoon dog" -> fox; fox -> cat; cat -> piglet; tubeworm; } $ gvpr "BEG_G { graph_t g = graph(name, 'U'); } E { clone(g, $); } END_G { write(g); }" fellows.gv graph kobutanukituneko { piglet -- "raccoon dog"; "raccoon dog" -- fox; fox -- cat; cat -- piglet; }
のように、孤立ノードがクローンされていない。
エッジをクローンする時にその端点のノードも自動的にクローンしてくれるのだが、
エッジが入出力していない孤立ノードはE節の対象外になることが原因だった。
$ gvpr "BEG_G { graph_t g = graph(name, 'U'); } E { clone(g, $); } N { clone(g, $); } END_G { write(g); }" fellows.gv graph kobutanukituneko { piglet -- "raccoon dog"; "raccoon dog" -- fox; fox -- cat; cat -- piglet; tubeworm; }
N節なら孤立ノードも対象となる。
このN節でもクローンを行うことでチューブワームもみんなの仲間になる。
無向グラフから有向グラフへの変換についても全く同じコードをN節に追加すればいい。