图边缘删除

时间:2014-01-04 17:16:45

标签: graph

我们得到一个没有循环的无向图。我们必须检查是否有可能删除边,使每个顶点的度数为1。

我应该尝试这个问题?我应该使用邻接矩阵还是列表。

请建议我有效的方式。

1 个答案:

答案 0 :(得分:0)

如果图形需要完全连接,则可能当且仅当 正好有两个顶点,它们之间有一条边。


如果不需要完全连接,则必须搜索a 类似的星座。也就是说,您需要查看是否可以 将图分割成顶点对,每个顶点有一条边 对。这就是我们追求的目标。我们知道什么?

图表没有循环。这意味着它必须是一棵树! (不必要 但是,二进制)。也许我们可以从开始时急切地解决这个问题 树的底部?我们不知道底部是什么;我们怎么样 解决了吗?我们可以自己决定,所以我决定挑选所有 留下“底部”。

我现在提出以下算法(你可能会有效率) 评估自己,它不一定是最好的算法):

  1. 对于每片叶子L:
    1. 设P为L的父项,Q为P的父项(Q可能为NULL)。
    2. P的程度是否<= 2?也就是说,它只有一个边缘 将它连接到L,可能还有一个连接到Q?
      1. 如果否:选择另一片叶子L并转到1.1。
      2. 如果是:L和P可以通过去除P和Q之间的边来形成一对。所以 从你的记忆中删除L和P(以某种方式;让我们回到 数据结构稍后)。
  2. 图表中是否还有顶点?
    1. 否:答案是“是的,我们可以通过删除边缘对图表进行分区”。
    2. 只有一个:答案是“不,我们不能对图表进行分区”。
    3. 更多:
    4. 我们删除了任何节点吗?
      1. 如果是:返回1并检查所有当前的叶子。
      2. 如果否:答案是“不,我们无法对图表进行分区”。
  3. 那么你使用什么数据结构呢?我认为这是最简单的 使用优先级队列,可能基于最小堆,度数为 优先。您可以使用链接列表作为叶子的临时存储 你已经访问但尚未删除。别忘了减少 步骤1.2.2中Q的优先级。

    但你可以做得更好!添加所有叶子(度数为1的顶点) 链表。在步骤1中循环显示该列表。在步骤1.2.2中,检查 去除L和P后的Q度。如果度数为1,则将其添加到 叶子清单!

    我相信你也可以递归地实现整个算法,但我让你 想一想。