仅使用graphviz工具生成可传递闭包
我需要处理点格式的有向图,并得到子图的传递闭包(实际上是一个节点) 例如,给定仅使用graphviz工具生成可传递闭包,graphviz,Graphviz,我需要处理点格式的有向图,并得到子图的传递闭包(实际上是一个节点) 例如,给定 A -> B; E -> B; B -> C; C -> D; 我想得到由节点A构成的子图的传递闭包: A -> B; B -> C; C -> D; 我知道这在python和许多其他语言中都是可能的,但我正在尝试仅使用命令行graphviz工具来实现这一点 有什么简单的方法吗?(我做了点、树、拼图的rtfm…没有任何运气)。应该能够完成这项任务。现在我来试
A -> B;
E -> B;
B -> C;
C -> D;
我想得到由节点A构成的子图的传递闭包:
A -> B;
B -> C;
C -> D;
我知道这在python和许多其他语言中都是可能的,但我正在尝试仅使用命令行graphviz工具来实现这一点
有什么简单的方法吗?(我做了点、树、拼图的rtfm…没有任何运气)。应该能够完成这项任务。现在我来试试
编辑不是很容易,但这可能是一个起点
--文件closure.gprv
BEGIN {
int to_visit[];
void add_req(node_t N) {
edge_t e;
for (e = fstout(N); e; e = nxtout(e))
to_visit[e.head.name] = 1;
}
}
BEG_G {
$tvtype = TV_fwd;
$tvroot = node($, "A");
to_visit[$tvroot.name] = 1;
add_req($tvroot);
graph_t g = graph("A closure", "D");
}
N {
if (to_visit[$.name]) {
copy(g, $);
add_req($);
}
}
END_G {
$O = g;
}
--文件closure.gv
digraph closure {
A -> B;
E -> B;
B -> C;
C -> D;
}
--命令和结果
gvpr -f closure.gprv closure.gv
digraph "A closure" {
A;
B;
C;
D;
}
编辑此其他版本更完整,因为它也构建了边
BEGIN {
int to_visit[];
void add_req(node_t N) {
edge_t e;
for (e = fstout(N); e; e = nxtout(e))
to_visit[e.head.name] = 1;
}
}
BEG_G {
$tvtype = TV_fwd;
$tvroot = node($, "A");
to_visit[$tvroot.name] = 1;
add_req($tvroot);
graph_t g = graph("A closure", "D");
}
E {
if (to_visit[$.tail.name]) {
copy(g, $);
add_req($.head);
}
}
END_G {
$O = g;
}
屈服
gvpr -f closure.gprv closure.gv
digraph "A closure" {
A -> B;
B -> C;
C -> D;
}
谢谢有没有办法从文档中保留节点的属性(如颜色、形状…)据我所知,
copy
应该有效:在图g中创建对象x的副本,其中新对象与原始对象具有相同的名称/值属性。
。也有克隆或复制,但我不知道的行为。。。