最长路径算法_最短和最长路径算法:求职面试速查表

最长路径算法

图形中最短和最长路径算法的快速概述和比较。

关于图形中无辜的看起来最短和最长路径问题,有许多小点需要记住。 在计算机程序员的技术工作面试中,关于此主题的问题非常常见。 但是,通常很难保持内存新鲜并记住有关这些问题及其算法的所有详细信息。

例如:

  • 您知道在图中找到最短的简单路径是NP难的吗? (如果没有,请参见下面的最长路径部分)
  • 您知道在某些图中可以在线性时间内找到最短路径吗?

在这里,我对一个地方的每个著名算法提供了一个简短的总结和要点,可以在每次面试之前快速对其进行回顾。

开始之前:

首先,我们假设图形为G(V,E)具有,其中

  • V = {1,2,…,n},| V | = n
  • | E | =米

对于最短路径问题,我们假设我们在最短的非简单路径之后,即顶点可以重复。 另外,我们假设边缘权重可以是整数值,即正,负或零。

最短距离问题只需要节点之间的最短距离,而最短路径问题需要节点之间的实际最短路径。 我们在这里讨论最短距离问题。 通常可以在算法中稍加改进的情况下找到最短路径。

Floyd-Warshall算法

Floyd-Warshall是最简单的算法:

快速直觉 :我们仅使用集合{1,2,…,k} 中的节点作为它们之间的中间点 ,计算从节点ij的最短路径。 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[
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值