这是练习:
令v和w为有向图G =(V,E)的两个顶点。设计线性时间算法以查找v和w之间不同的最短路径(不一定是顶点不相交)的数量。注意:G中的边缘未加权
对于此消费税,我总结如下:
从以上几点来看,我有以下想法:
count
global level
shortest level
count++
我的算法正确吗?如果我对v进行v运算,然后对w进行v运算,那是否仍视为线性时间?
这里有一些想法。
证明:如果有多个路径x通过同一顶点进入,则显然有多种方法通过x。这很简单。现在,让我们假设进入x每个顶点x(最多)只有一种方法。
x
如果以前曾遇到过x,则当前路径都不能构成另一个最短路径。由于以前已经遇到过x,因此所有可以遵循的路径至少比先前的最短路径长一。因此,这些路径均无法贡献总和。
但是,这意味着我们最多遇到每个节点一次并完成。因此,正常的BFS就可以了。
可以将其编译为非常简单的算法,主要是BFS。
- Mark nodes as visited as usual with BFS. - Instead of adding just nodes to the queue in the DFS add nodes plus number of incoming paths. - If a node that has been visited should be added ignore it. - If you find a node again, which is currently in the queue, do not add it again, instead add the counts together. - Propagate the counts on the queue when adding new nodes. - when you encounter the final, the number that is stored with it, is the number of possible paths.