我需要一个很好的树分解图,给出一个消除顺序和图的弦线化。
我的想法是获取图中的所有派系(我可以做),并从根开始构建二叉树,并根据派系的共同点数生成子项(即派系)。我想这样做直到使用所有派系,因此,我有一棵树。问题是派系可能有两个以上的顶点,所以我不能递归地为每个顶点运行,因为树可能不是二进制。
http://en.wikipedia.org/wiki/Tree_decomposition http://en.wikipedia.org/wiki/Chordal_graph
我正在python中进行实现,目前我有chordal图,所有派系列表和排序顺序。想法和/或代码非常受欢迎!
答案 0 :(得分:2)
构造一个非常好的(通常)和弦图的树分解:找到一个完美的消除顺序,枚举最大集团(候选者是一个顶点和排序后出现的邻居) ,使用每个集团作为分解节点,并将其连接到它相交的排序中的下一个集团。我没有描述那么正确;见我的subsequent answer。
nice 树分解定义如下(来自Daniel Marx的定义)。漂亮的树分解根深蒂固。每个节点都是四种类型之一。
Leaf (no children): a set {v}
Introduce (exactly one child): a set S union {v} with child S (v not in S)
Forget (exactly one child): a set S with child S union {v} (v not in S)
Join (exactly two children): a set S with children S and S
任意植入非好的树分解并在根处开始递归转换过程。如果当前节点没有子节点,则构造由带有祖先的叶节点组成的明显链。否则,请注意,如果某个顶点属于至少两个子节点,则它属于当前节点。递归转换子和链忘记祖先,直到它们的集是当前节点的子集。从理论上讲,最简单的方法是将缺失的元素引入每个孩子,然后集体加入。但是,由于下一步的运行时间通常取决于设定的大小,因此在子集完成之前尝试一些启发式方法来加入子项可能是明智的。