当前位置: 首页 > 知识库问答 >
问题:

用通用Lisp表示有向无环图

尉迟韬
2023-03-14

通常,为了在Lisp中表示一个基本的无向图,我可以创建一个父节点和它们对应的子节点的列表,正如本问题中所讨论的那样(为了方便起见,下面举例说明)。

这张图给出了一个边列表:

(1 (2 6 7 8) 3 (4 (9 12)) 5 (10 11)) 

这适用于树或任何其他无向图的情况。然而,当我们想要表示一个有向无环图时,这种类型的表示就会崩溃,其中每个节点可以有多个父节点:

(1 (2 6 7 8) (3 8) (4 (9 12)) (5 10 11))

共有1个答案

慕容兴贤
2023-03-14

表示DAG的正确方法是节点(顶点)的集合:

(defstruct node
  payload
  children)

由于结构只有两个插槽,所以当然可以使用cons单元格。

您给出的树的列表表示将有效负载与无子节点混为一谈,并将最右边的分支弄乱。正确的表示形式是

(1 (2 (6) (7) (8)) (3) (4 (9 (12))) (5 (10) (11)))
(1 (2 (6) (7) #1=(8)) (3 #1#) (4 (9 (12))) (5 (10) (11)))
(defun make-node (&key payload children)
  (cons payload children))
(defparameter *my-dag*
  (let ((shared-mode (make-node :payload 8)))
    (make-node
     :payload 1
     :children
     (list (make-node :payload 2
                      :children (list (make-node :payload 6)
                                      (make-node :payload 7)
                                      shared-mode))
           (make-node :payload 3
                      :children (list shared-mode))
           (make-node :payload 4
                      :children (list (make-node :payload 9
                                                 :children (list (make-node :payload 12)))))
           (make-node :payload 5
                      :children (list (make-node :payload 10)
                                      (make-node :payload 11)))))))
(setq *print-circle* t)
*my-dag*
==> (1 (2 (6) (7) #1=(8)) (3 #1#) (4 (9 (12))) (5 (10) (11)))
 类似资料:
  • 本文向大家介绍common-lisp 有界环,包括了common-lisp 有界环的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以使用重复操作多次repeat。            

  • 我在NetworkX中有一个有向无环简单图。 现在,对于每个边,该边都有一个“源”和一个“目标”。如果除了这个边之外,还有一条从“源”到“目标”的路径,那么我想删除这个边。 null > 节点为: 边缘是:

  • 目前我正在用这个样本进行拓扑排序,并对https://www.geeksforgeeks.org/topological-sorting/做了一些修改 我用它来排序要求解的变量的顺序。 样本 每个变量都有一个唯一整数,并存储在一个映射中 创建图形并添加边时,总共有4个顶点,因此我的代码将像这样构造图形 排序并按相反顺序得到结果后,它是正确的c 一切都很好,但我需要检测图中的循环引用。假设变量是 有

  • 以下资源包含有关LISP的其他信息。 请使用它们来获得有关此主题的更多深入知识。 关于LISP的有用链接 LISP编程 - LISP编程的维基百科参考。 LISP - LISP博客 关于LISP的有用书籍

  • 本文向大家介绍common-lisp简单引用示例,包括了common-lisp简单引用示例的使用技巧和注意事项,需要的朋友参考一下 示例 Quote是一种特殊的运算符,可防止评估其参数。它返回其参数,未被评估。            

  • 考虑以下无向非循环图: 如果我们定义“根”为A和E,有没有算法可以确定产生的有向无环图?: 我考虑过从根开始尝试某种DFS或BFS,但我不确定如何处理“等待”的需要,以查看另一个根是否可能到达给定的节点。