Algorithm 将图节点分配到桶中

Algorithm 将图节点分配到桶中,algorithm,graph-theory,graph-algorithm,Algorithm,Graph Theory,Graph Algorithm,我有一个邻接矩阵nxn。图中的每个节点都有m输出边,我想将这些节点分配到b存储桶中。 每个存储桶应至少容纳l和u节点(uxb=n)。bucket内的每个节点都应该至少有一条到bucket内另一个节点的传出边 我觉得我错过了解决这个问题的最佳角度。 您将如何处理此问题?首先将图形分割为连接的组件。这可以通过执行深度优先或广度优先搜索在O(n)时间和内存内完成 如果任何节点未连接到另一个节点,则无法找到解决方案 从每个DFS/BFS树的叶子(即仅连接到另一个节点的节点)开始,将每个连接的组件拆分为相

我有一个邻接矩阵
n
x
n
。图中的每个节点都有
m
输出边,我想将这些节点分配到
b
存储桶中。 每个存储桶应至少容纳
l
u
节点(
u
x
b
=
n
)。bucket内的每个节点都应该至少有一条到bucket内另一个节点的传出边

我觉得我错过了解决这个问题的最佳角度。
您将如何处理此问题?

首先将图形分割为连接的组件。这可以通过执行深度优先或广度优先搜索在O(n)时间和内存内完成

如果任何节点未连接到另一个节点,则无法找到解决方案

从每个DFS/BFS树的叶子(即仅连接到另一个节点的节点)开始,将每个连接的组件拆分为相邻节点的成对(或三元组)。每对(或三元组)都应该进入下一个存储桶,其中节点数最少

      o   o
     / \  |
o   o   o o     |    |    |    |    |    |
|  / \ /  |     |    |    |    |    |    |
o o   o   o     |    |    |    |    |    |
 \ \ /   /      |____|    |____|    |____|
  --o----      Bucket 1  Bucket 2  Bucket 3
从左叶中删除2个节点

      o   o
     / \  |
a   o   o o     |a   |    |    |    |    |
|  / \ /  |     ||   |    |    |    |    |
a o   o   o     |a   |    |    |    |    |
 \ \ /   /      |____|    |____|    |____|
  --o----      Bucket 1  Bucket 2  Bucket 3
从右叶中删除2个节点

      o   b
     / \  |
    o   o b     |a   |    |b   |    |    |
   / \ /  |     ||   |    ||   |    |    |
  o   o   o     |a   |    |b   |    |    |
   \ /   /      |____|    |____|    |____|
    o----      Bucket 1  Bucket 2  Bucket 3
然后删除最终阶数为1的顶点及其相邻顶点:

      o    
     / \   
    o   o       |a   |    |b   |    |c   |
   / \ /        ||   |    ||   |    ||   |
  o   o   c     |a   |    |b   |    |c   |
   \ /   /      |____|    |____|    |____|
    c----      Bucket 1  Bucket 2  Bucket 3
这将在剩余子图中创建一个新的1度顶点,以便删除该顶点及其相邻顶点:

      o    
     / \   
    d   o       |a d |    |b   |    |c   |
   / \ /        || | |    ||   |    ||   |
  d   o         |a d |    |b   |    |c   |
                |____|    |____|    |____|
               Bucket 1  Bucket 2  Bucket 3
只剩下3个顶点,如果它适合放入一个桶中,则将其放入桶中-否则,将一对顶点从物品数量最少的桶移动到物品数量次之的桶中,并将三元组添加到其位置

      e    
       \   
        e       |a d |    |e e |    |c b |
       /        || | |    |\ / |    || | |
      e         |a d |    | e  |    |c b |
                |____|    |____|    |____|
               Bucket 1  Bucket 2  Bucket 3
唯一的问题是,当您获得星形连接组件时

  o   o
   \ /
 o--o--o
   / \
  o   o

然后,整个连接的组件将需要放入同一个桶中,因为您无法通过移除一对相邻顶点的三元组来拆分图形,而不保留单个不相交的顶点。您可以通过测试是否删除了一对相邻顶点的阶数为1,并将其添加到该对中来检查此问题。

您对一致性(随机性)有什么期望,或者有什么解决方案可以吗?请您解释一下这一点好吗“bucket中的每个节点都应该至少有一个到bucket中另一个节点的传出边缘。”如果我重新表述这一点,是否意味着“每个bucket应该至少有两个不同的节点,它们之间有一个边缘。“@AhmadFaiyaz不,这还不够。对于bucket中的每个节点,至少有一个传出边需要指向同一bucket中的节点。@rici bucket中的互连节点越多越好。如何检查最终解决方案的正确性。所有节点都在一个bucket中,而每个bucket中有2个节点,哪个更正确?桶的数量是预先定义的吗?哇,这是一个很好的答案。我想我需要试试看我是否理解正确。我会回来报到的。但是已经谢谢你了。