我有以下问题,我不太确定如何解决它:
给定一个图G = (V;E)
,其中每个边e都有一个正整数成本c_e
和一个起始顶点s\in V
。设计O(V + E)
算法,使用路径(不一定是简单路径)标记从s
可到达的所有顶点,该路径的总成本为5的倍数。
如何跟踪我已经访问过的路径的总费用?我一直在研究无向加权图中的BFS,并尝试在这里使用它,但是大多数BFS参考都集中在找到最短路径(而不是像保持5的倍数)
答案 0 :(得分:1)
您如何看待下一个算法?
让我们考虑基于源图的新有向图。对于源图中的每个顶点v
,在新图中创建5
个新顶点v[0], v[1], ..., v[4]
,对应于5
除以的模块。然后,如果顶点v
和u
在源图中通过权重w
的边连接,请在v[i]
和u[(i + w) % 5]
之间添加边u[j]
,{{新图表中的1}}和v[(j + w) % 5]
,其中i = 0..4, j = 0..4
。然后从v[0]
运行 BFS ,其中v
是源图中的起始顶点。
考虑索引0
的顶点,如v[0]
。它们中的每一个对应于源图中5
到顶点v
的长度倍数的路径。在 BFS 之后标记的所有这些顶点都可以从起始顶点到达,形成答案。总复杂度是线性的。