最长路径算法
图形中最短和最长路径算法的快速概述和比较。
关于图形中无辜的看起来最短和最长路径问题,有许多小点需要记住。 在计算机程序员的技术工作面试中,关于此主题的问题非常常见。 但是,通常很难保持内存新鲜并记住有关这些问题及其算法的所有详细信息。
例如:
- 您知道在图中找到最短的简单路径是NP难的吗? (如果没有,请参见下面的最长路径部分)
- 您知道在某些图中可以在线性时间内找到最短路径吗?
在这里,我对一个地方的每个著名算法提供了一个简短的总结和要点,可以在每次面试之前快速对其进行回顾。
开始之前:
首先,我们假设图形为G(V,E)具有,其中
- V = {1,2,…,n},| V | = n
- | E | =米
对于最短路径问题,我们假设我们在最短的非简单路径之后,即顶点可以重复。 另外,我们假设边缘权重可以是整数值,即正,负或零。
最短距离问题只需要节点之间的最短距离,而最短路径问题需要节点之间的实际最短路径。 我们在这里讨论最短距离问题。 通常可以在算法中稍加改进的情况下找到最短路径。
Floyd-Warshall算法
Floyd-Warshall是最简单的算法:
快速直觉 :我们仅使用集合{1,2,…,k} 中的节点作为它们之间的中间点 ,计算从节点i到j的最短路径。 d(i,j,k)表示仅使用k个节点的i,j之间的最短距离。 我们可以这样写:
d(i,j,k)= min(d(i,j,k-1),d(i,k,k-1)+ d(k,j,k-1))
下图显示了这种直觉:
通过比较使用k-1个节点从i到j的最短路径以及使用k-1个节点从i到k以及从k到j的总和,可以计算使用k个节点从i,j的最短路径。
下面的视频清楚地说明了Floyd-Warshall算法:
下面是C ++的实现:
// Floyd-Warshall Algorithm for finding the shortest distance
vector < vector < long long >> floydWarshal( vector < vector < int >> &graph) {
vector < vector < long long >> d(graph.size(),
vector < long long >(graph.size()));
//Initialize d
for ( int i = 0 ; i < graph.size(); ++i) {
for ( int j = 0 ; j < graph.size(); ++j) {
d[i][j] = graph[i][j];
}
}
for ( int k = 0 ; k < graph.size(); k++)
for ( int i = 0 ; i < graph.size(); ++i)
for ( int j = 0 ; j < graph.size(); ++j)
d[i][j] = std ::min(d[