如何在面向图中传播变化?

时间:2010-03-18 16:09:47

标签: algorithm graph graph-theory

我有面向图。图可以强烈连接。每个顶点都可以有一组任何东西,例如字母。该集是用户可编辑的。

每个顶点在先前的顶点中进行交集(仅后退一步)。

但是现在有问题:当我更新一个顶点的集合时,更改应该扩展到所有顶点并对它们之前顶点集的交集进行加速。

如何更新任何顶点后每个顶点都有正确的交点? 限制:算法必须避免陷入无穷大。 ...

知道怎么解决吗? 修改

示例 - 红色顶点发生变化,需要传播所有顶点的交点变化: alt text http://img402.imageshack.us/img402/7608/beznzvuru.jpg

3 个答案:

答案 0 :(得分:2)

看起来像BFS会这样做:

  1. 记住已更改的顶点集。
  2. 现在从更改的顶点
  3. 开始广度优先搜索
  4. 对于每个相邻顶点,根据(1)
  5. 中的集合更改相应的集合
  6. 将顶点标记为已访问
  7. 对每个相邻顶点重复1-4,直到不再存在未访问的顶点
  8. 也许你真正的问题在于集合的交集。你会在这里指出(3)。您应该添加一个示例以使问题更加清晰。

答案 1 :(得分:1)

您可以将更改拆分为减法添加更改。可以使用MicSim描述的方法在一次通过中去除任何减法。但是,任何添加剂都可能在您拥有的任何循环中一直传播。

对于添加剂更改,请以相同方式执行更新,但忽略尚未更新的任何输入。这将导致您过多地填充图表,因为您没有计算所有交叉点。但是如果你再回去第二遍,你将清理所有的变化。 (你可能需要继续扫描,直到没有更多变化;我不完全确定。)

我想如果你不关心跟踪添加的内容和减去的内容 - 只是有一个更改 - 你只需要进行初始扫描,其中需要更新但未更新的节点不会相交,然后继续扫过,直到一切都安定下来。由于交集只能删除元素,因此可以保证完成。

答案 2 :(得分:0)

按照MicSim的建议做BFS,在没有改变任何顶点的迭代后停止。