9

dotGraphviz の言語で指定された有向グラフがあります。

digraph G { A -> B [label="foo"]; A -> B [label="bar"]; B -> A; C; }

これをエッジが逆になったグラフに自動的に処理したい、つまり

digraph G { B -> A [label="foo"]; B -> A [label="bar"]; A -> B; C; }

sed既存のエッジ ラベルやその他の属性を保持する堅牢なソリューション (つまり、グラフを理解しているため、おそらく を使用しないソリューション) を使用したいと考えています。dot矢印が後ろを向いた状態でグラフをレンダリングすることについて話しているだけではないことに注意してください。エッジが逆になっているグラフが本当に必要です。prune(この場合、エッジを反転し、 を適用してから、再びエッジを反転するつもりです。)

dotGraphviz ( -language) グラフのすべてのエッジの方向を逆にするにはどうすればよいですか?

4

3 に答える 3

10

Easiest way is to include a graph-level dir statement where you reverse the direction of the arrows. By default, the direction is forward. If you reverse it at the top of your graph, then without changing a single other line, the graph will show up the way you want.

What you have now is this:

digraph G
{
    edge [dir="forward"]; /* implied */
    A -> B [label="foo"];
    A -> B [label="bar"];
    B -> A;
    C;
}

What you want is this:

digraph G
{
    edge [dir="back"]; /* note the change to this line */
    A -> B [label="foo"];
    A -> B [label="bar"];
    B -> A;
    C;
}
于 2014-08-11T00:15:50.853 に答える
2

私がこれまでに思いついた最高のものは

BEG_G {
    graph_t g = graph($.name + " reversed", "D");
    int edge_id = 0;
}

N {
    clone(g, $);
}

E {
    node_t newHead = clone(g, $.head);
    node_t newTail = clone(g, $.tail);
    edge_t newEdge = edge_sg(g, newHead, newTail, edge_id);
    copyA($, newEdge);
    edge_id++;
}

END_G {
    $O = g;
}

次に、で呼び出しgvprます。

これにより、結果として得られるすべてのエッジに「キー」属性が追加されますが、それを回避して同じノードのペア間で複数のエッジを保持する方法がわかりません。

するとecho 'digraph G { A -> B [label="foo"]; A -> B [label="bar"]; B -> A; C; }' | gvpr -f reverseAllEdges.gvpr、次のようになります。

digraph "G reversed" {
    A -> B [key=2];
    B -> A [key=0, label=foo];
    B -> A [key=1, label=bar];
    C;
}

これがどれほど堅牢であるかはわかりませんが、有望に見えます。

于 2012-04-13T20:13:36.240 に答える
0

Python ライブラリ NetworkX には、 reverse () メソッドを持つ有向マルチグラフ タイプ MultiDiGraph があります。また、DOT ファイルの読み込みと書き込みに pydot を使用します。

于 2012-06-08T11:45:23.603 に答える