这是练习题:
假设有一个有向图 G=(V,E),其中 v 和 w 是两个顶点。请设计一种线性时间复杂度算法,用于查找 v 和 w 之间不同的最短路径数量(路径不一定要求顶点不重复)。注意:G 中的边都是没有权重的。
总结一下:
- G 是一个有向图;
- 需要找到最短路径的数量;
- 需要考虑 v 到 w 和 w 到 v 两个方向上的路径;
- 算法需要是线性时间复杂度;
- G 的边没有权重。
基于以上的条件,我的想法如下:
- 由于 G 中的边没有权重,并且我们需要找到所有的最短路径而不是单一路径,因此不需要使用 Dijkstra’s Algorithm;
- 我需要维护一个变量
count
来记录最短路径的数量; - 我打算使用 BFS 从 v 开始遍历整个图,并维护一个全局层数的信息;
- 每当 BFS 遍历到一个新的层数时,我将全局层数增加 1;
- 我还需要维护到顶点 w 的最短路径长度的信息;
- 当 BFS 遍历到 w 时,如果当前的全局层数等于最短路径长度,那么将
count
增加 1,并将全局层数赋值给最短路径长度; - 只要全局层数等于最短路径长度,就每次遍历到 w 就将
count
增加 1; - 当全局层数大于最短路径长度时,就可以终止遍历。因为我们要找到的是最短路径而不仅仅是路径。
- 然后再从 w 开始做一遍 v 到 w 的操作即可。
我的算法正确吗?如果我先从 v 到 w 再从 w 到 v,这仍然被认为是线性时间复杂度吗?