【问题标题】:Graph Traversal Algorithm with discount带折扣的图遍历算法
【发布时间】:2014-10-07 23:02:23
【问题描述】:

我有一个带加权边的有向图,我想在我的图中找到所有对的最短路径。但我希望能够考虑到折扣。

例如:

A->B    with weight 10
A->C    with weight 20
B->C    with weight 10
C->D    with weight 10
A->B->C with weight 15 because I get a discount of 5 if and only if I visit B first. (see clarification)

A->B->C->D should therefor have weight 25 while
A->C->D    with weight 30

有没有办法实现这个?我查看了各种算法(Floyd-Warshall 等),但他们似乎没有认识到这个问题......

编辑:澄清:只有组合 (A->B->C) 获得折扣。

E->(A->B->C)->F gets it because it has the exact combination in its path, but 
A->E->B->C      does not get it

【问题讨论】:

  • A->E->B->F->C有优惠吗?
  • 不可以,只有A->B->C才能打折
  • 这仍然是一个不充分的问题定义。如何准确描述所有折扣的集合? “如果我先访问 B”这句话有许多不同的可能含义。
  • 你为什么不能添加一个快捷方式到A->C 和所有其他折扣子路径?
  • 所以实际上不是全对最短路径,而是带航点的最短路径?

标签: algorithm graph graph-theory graph-algorithm


【解决方案1】:

您可以通过添加边和虚拟节点来表示折扣来扩充您的图表。例如,如果您对路径 A->B->C 有折扣,请添加一个 边缘的新节点 B'

A->B'
B'->C

这样

w(A,B') + w(B',C) = w(A,B) + w(B,C) - discount

其中w(S,T) 是边S->T 的权重。将折扣应用于哪个边缘并不重要,因此您可以拥有

w(A,B') = 10, w(B',C) = 5, or
w(A,B') = 5 , w(B',C) = 10

请注意,如果您有一个节点 Q,其中在原始图中出现在 Q 上的唯一边是:

S->Q
Q->T

并且要为路径S->Q->T申请折扣,添加新节点Q'是多余的。您可以安全地将折扣应用于原始图表。如果你无论如何添加虚拟节点,它不会导致结果错误,甚至任何不同,它只会在搜索中添加不必要的节点。

显然,在路径的输出中,您应该将任何虚拟节点视为其原始对应节点,即 A->B'->C 的路径应报告为 A->B->C

【讨论】:

  • 我认为这可行。我会在星期一试一试。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多