如何从电阻网络中删除周期

时间:2015-01-17 16:56:43

标签: c++ algorithm data-structures graph

我有一个由无向图表示的电阻网络,其边缘代表电阻值。一些节点称为驱动程序,一些节点称为接收器,其他节点称为内部节点。目标是计算每个驱动器到每个接收器的有效电阻。该图可以具有周期,星三角网络。因此,下面的公式可以用来计算有效阻力。

Wiki article

请注意,如果图形没有任何周期,那么简单的DFS遍历将为每个接收器提供驱动器有效电阻。但如果它有周期,则必须删除周期。一种方法是将图形复制到临时图形中,然后使用上面的公式从驱动器和接收器中删除临时图形中的所有节点。对所有驱动程序接收器对执行此操作,但对于大型密集图形,此方法非常耗时。通过将图存储在tcl哈希表或std::tr1::unordered_map中,我得到了这个高运行时间。

您是否知道有效的方法来计算每个吸收电阻的每个驱动器?

我有一个效率低下的解决方案,即 每个接收器的每个驱动器        将原始图形复制到临时图形中        然后使用我上面提到的wiki文章从临时图中删除除源和那个接收器之外的所有节点。        最终的临时图表将在该源和该接收器之间提供有效的阻力。 对于大输入数据,此解决方案的运行时间是不可接受的,因此我需要更好的解决方案。

1 个答案:

答案 0 :(得分:4)

要计算每个驱动程序到每个接收器的有效阻力,您不需要执行图形转换。相反,你可以

  1. 对于每对驱动程序和接收器,将驱动程序节点指定为1V,将接收节点指定为0
  2. 执行nodal analysis,只需要线性方程式。并且您从驱动程序到接收器获得当前I流。
  3. 根据定义,有效抵抗R = V / I = 1 / I